当前位置: 首页 > news >正文

【数据结构】实验五:栈

实验五 

一、实验目的与要求

1)熟悉栈的类型定义和基本操作;

2灵活应用栈解决具体应用问题。

二、实验内容

1、判断回文数,回文是指正读反读均相同的字符序列,如“1221”和“12321”均是回文,但“1234”不是回文。请写一个算法判定给定的字符向量是否为回文。(提示:将一半字符入栈)

2、给定一个只包括 '('')''{''}''['']' 的字符串,判断字符串是否有效。有效字符串需满足:

左括号必须用相同类型的右括号闭合。

左括号必须以正确的顺序闭合。

示列:"()""()[]{}"都是合法的括号序列,但"( ]""( [ )]"不合法。

3在某程序中,有两个栈共享一个一维数组空间SPACE[N]SPACE[0]SPACE[N-1] 分别是两个栈的栈底。(扩展选作)

  (1)对栈1、栈2,试分别写出(元素x)入栈的主要语句和出栈的主要语句。

  (2)对栈1、栈2,试分别写出栈满、栈空的条件。

三、实验结果

1)请将调试通过的源代码粘贴在下面。(代码注意书写规范、主要模块要有功能注释)

实验1代码:

#include <iostream>
#include <cstring>
using namespace std;
typedef struct{char data[1000];int top;
}Stack;//初始化栈 
void Init_stack(Stack *s){s->top=-1;
}//元素入栈 
void Push_stack(Stack *s,char x){s->top=s->top+1;s->data[s->top]=x;
}//元素出栈 
void Pop_stack(Stack *s,char *x){*x=s->data[s->top];s->top=s->top-1;
}int main(){char data[1000],x;int i;Stack s;//初始化测试栈 Init_stack(&s);cin>>data;//输入的字符串长度 int len=strlen(data);//输入的字符串入栈 for(i=0;i<len;i++){Push_stack(&s,data[i]);}//首尾对比,判断回文数 for(i=0;i<len;i++){Pop_stack(&s,&x);if(data[i]!=x){cout<<"不是回文数"<<endl;return 0;}}cout<<"是回文数"<<endl;return 0;
}

实验1结果展示:

 

 

 

 实验2代码:

#include <iostream>
#include <cstring>
using namespace std;typedef struct{char data[1000];//元素 int top;//顶指针 
}Stack;//初始化栈 
void Init_stack(Stack *s){s->top=-1;
}//元素入栈 
void Push_stack(Stack *s,char *x){s->top=s->top+1;s->data[s->top]=*x;
}//元素出栈 
void Pop_stack(Stack *s,char *x){*x=s->data[s->top];s->top=s->top-1;
}int main(){char str[1000];Stack s;Init_stack(&s);cout<<"Please input your string:";cin>>str;int len=strlen(str),i=0;//len为str的长度 //cout<<len;//如果长度为奇数,一定缺少括号 if(len%2!=0){cout<<"Wrong string!"<<endl;return 0;}//长度为偶数,分类讨论 for(i=0;i<len;i++){//[]情况 if(str[i]=='['){Push_stack(&s,&str[i]);if(str[i+1]==']'){Pop_stack(&s,&str[i]);continue;}else{cout<<"Wrong string!"<<endl;return 0;}}//()情况 if(str[i]=='('){Push_stack(&s,&str[i]);if(str[i+1]==')'){Pop_stack(&s,&str[i]);continue;}else{cout<<"Wrong string!"<<endl;return 0;}}//{}情况 if(str[i]=='{'){Push_stack(&s,&str[i]);if(str[i+1]=='}'){Pop_stack(&s,&str[i]);continue;}else{cout<<"Wrong string!"<<endl;return 0;}}}cout<<"Right string!"<<endl; return 0;
}

实验2结果展示:

 

 

 

 

 实验3代码:

#include <cstdio>
#define MaxSize 10 //栈的容量 
#define ElemType int
#include <iostream>
using namespace std;			typedef struct {ElemType data[MaxSize];		int top1;//1号栈栈顶指针int top2;//2号栈栈顶指针
}ShStack;//初始化共享栈
void InitShStack(ShStack& S) {S.top1 = -1;//初始化1号栈栈顶指针S.top2 = MaxSize;//初始化2号栈栈顶指针
}//1号栈判空
bool Stack1Empty(ShStack S) {return (S.top1 == -1);
}//2号栈判空
bool Stack2Empty(ShStack S) {return (S.top2 == MaxSize);
}//1号栈入栈操作:新元素入栈(先存再加)
bool Push1(ShStack& S, ElemType x) {if (S.top1+1 == S.top2){return false;//栈满,报错}S.data[++S.top1] = x;return true;
}//2号栈入栈操作:新元素入栈(先存再加)
bool Push2(ShStack& S, ElemType x) {if (S.top1+1 == S.top2){return false;//栈满,报错}S.data[--S.top2] = x;return true;
}//1号栈出栈操作:栈顶元素出栈
bool Pop1(ShStack& S, ElemType& x) {if (S.top1 == -1){return false;//1号栈栈空,报错}x = S.data[S.top1--];	return true;
}//2号栈出栈操作:栈顶元素出栈
bool Pop2(ShStack& S, ElemType& x) {if (S.top2 == MaxSize){return false;//2号栈栈空,报错}x = S.data[S.top2++];return true;
}//1号栈读取栈顶元素操作
bool GetTop1(ShStack S, ElemType& x) {if (S.top1 == -1){return false;//1号栈栈空,报错}x = S.data[S.top1];return true;
}//2号栈读取栈顶元素操作
bool GetTop2(ShStack S, ElemType& x) {if (S.top2 == MaxSize){return false;//2号栈栈空,报错}x = S.data[S.top2];return true;
}int main() {//声明一个共享栈ShStack S;		//初始化共享栈InitShStack(S);//1号栈-判空if(Stack1Empty(S)){printf("当前1号栈空!\n");}else{printf("当前1号栈非空!\n");}//1号栈-入栈操作ElemType e1;printf("请输入1号栈入栈元素的值:");scanf("%d", &e1);if(Push1(S, e1)){printf("1号栈新元素入栈成功!\n");}else{printf("共享栈已满,1号栈新元素入栈失败!\n");}//1号栈-读取栈顶元素ElemType e2 = -1;if(GetTop1(S, e2)){printf("1号栈读取栈顶元素成功,当前栈顶元素值为:%d\n", e2);}else{printf("1号栈已空,读取栈顶元素失败!\n");}//1号栈-出栈操作ElemType e3 = -1;if(Pop1(S, e3)){printf("1号栈栈顶元素出栈成功,出栈元素值为:%d\n", e3);}else{printf("1号栈已空,栈顶元素出栈失败!\n");}//1号栈-读取栈顶元素ElemType e4 = -1;if (GetTop1(S, e4))printf("1号栈读取栈顶元素成功,当前栈顶元素值为:%d\n", e4);elseprintf("1号栈已空,读取栈顶元素失败!\n");cout<<endl;//2号栈-判空if (Stack2Empty(S)){printf("当前2号栈空!\n");}else{printf("当前2号栈非空!\n");}//2号栈-入栈操作ElemType e21;printf("请输入2号栈入栈元素的值:");scanf("%d", &e21);if (Push2(S, e21)){printf("2号栈新元素入栈成功!\n");}else{printf("共享栈已满,2号栈新元素入栈失败!\n");}//2号栈-读取栈顶元素ElemType e22 = -1;if (GetTop2(S, e22)){printf("2号栈读取栈顶元素成功,当前栈顶元素值为:%d\n", e22);}else{printf("2号栈已空,读取栈顶元素失败!\n");}//2号栈-出栈操作ElemType e23 = -1;if (Pop2(S, e23)){printf("2号栈栈顶元素出栈成功,出栈元素值为:%d\n", e23);}else{printf("2号栈已空,栈顶元素出栈失败!\n");}//2号栈-读取栈顶元素ElemType e24 = -1;if (GetTop2(S, e24)){printf("2号栈读取栈顶元素成功,当前栈顶元素值为:%d\n", e24);}else{printf("2号栈已空,读取栈顶元素失败!\n");}return 0;
}

实验3结果展示:

 


2)请分析你程序中每个功能模块的算法时间复杂度。

实验1:

单元素出栈只需要锁定顶层的元素即可。所以,时间复杂度为O(1)

单元素入栈只需要对顶层进行元素覆盖即可。所以,时间复杂度为O(1)

假设字符串长度为len,那么多元素入栈需要执行len次。所以,时间复杂度为O(n)

本段代码通过对入栈后的字符串反向出栈进行判断,即出栈的第一个元素是原来字符串的最后一个元素。我们可以令出栈的第一个元素与原字符串的第一个元素进行对比,来判断该字符串对应的数字是否为回文数。所以,时间复杂度为O(n)

实验2

出栈、入栈等操作沿用实验1的结果,这里不再赘述。

当输入的符号字符串长度为奇数的时候,一定有一个括号落单,即一定不可能为合法的输入。符号字符串的长度为偶数是必要不充分条件,因此直接否定奇数长度可减少算力。所以,时间复杂度为O(1)

本段算法通过循环先对当前的字符进行判断,再对下一个邻近的字符进行判断,即判断相邻两个括号是否为合法输入。整个过程需要对字符串每一个位置的字符进行判断。所以,时间复杂度为O(n)

实验3

判断栈是否为空栈,只需要判断顶指针是否处于-1位置。所以,时间复杂度为O(1)

新元素入栈的时候,先要判断共享栈是否已满。如果共享栈非满,那么在下一个位置插入一个元素,顶指针同时移动到该位置。所以,时间复杂度为O(1)

新元素出栈的时候,先要判断共享栈是否已空。如果共享栈非空,那么在当前位置弹出一个元素,顶指针同时移动到前一个位置。所以,时间复杂度为O(1)

查看共享栈的两个栈顶元素时,只需要在保证两个栈非空的情况下,对顶指针所指向的元素进行查看。所以,时间复杂度为O(1)


其他:

#include<iostream>
#include<cstring>
#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10
using namespace std;typedef struct SqStack {char *elem;int top;int stacksize;
}SqStack;//初始化栈,容量是事先定义好的,定义初始的top标号为-1.
void InitStack(SqStack& S)
{S.elem = new char[STACK_INIT_SIZE];if (!S.elem)cout << "Overflow!" << endl;S.top = -1;S.stacksize = STACK_INIT_SIZE;
}//该函数用来释放栈的空间
void DestroyStack(SqStack& S)
{delete[]S.elem;S.top = -1;S.stacksize = 0;
}//若栈已满,该函数用来增加栈的空间
void increment(SqStack& S)
{char *newstack = new char[S.stacksize + STACK_INCREMENT];if (!newstack)cout << "Overflow!" << endl;for (int i = 0; i <= S.top; i++){newstack[i] = S.elem[i];}delete[]S.elem;S.elem = newstack;S.stacksize += STACK_INCREMENT;
}//该函数用来往栈里面增添元素,因为是入栈,所以栈顶元素的位置数加一,该元素成为新的栈顶元素
void Push(SqStack& S, char e)
{if (S.top == S.stacksize - 1)increment(S);S.elem[++S.top] = e;
}//该元素用来返回栈顶元素的值
char GetTopStack(SqStack& S)
{if (S.top == -1)cout << "Empty!" << endl;return S.elem[S.top];
}//该函数用来将元素出栈
void Pop(SqStack& S)
{if (S.top == -1)cout << "Empty!" << endl;S.top--;
}//主函数:将字符串的长度len对2取模记为mid,将前mid个字符入栈。若该字符串回文:先给标志赋值为0,如果len为偶数,则第mid+1个元素应和栈顶元素相同,如果不同就直接退出循环,将标志的值改为1;相同就将元素出栈,判断下一个字符和栈顶元素是否相等,以此类推。如果len为奇数,则最中间的元素和其它元素都不同,跳过这个元素继续向下判断。最后通过标志的值判断该字符串是否回文:如果标志的值被修改,说明对称的两元素不相同,则字符串不回文。
int main()
{SqStack s;InitStack(s);char str[1000];cin >> str;int len = strlen(str);int mid = len / 2;int i, flag = 0;for (i = 0; i < mid; i++){Push(s, str[i]);}if (len % 2 == 1)i++;while (i<len){if (GetTopStack(s) != str[i]){flag = 1;break;}i++;Pop(s);}if (flag){cout << "该字符向量不是回文!" << endl;}else{cout << "该字符向量是回文!" << endl;}return 0;
}
#include<iostream>
#include<cstring>
#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10
using namespace std;typedef struct SqStack {char* elem;int top;int stacksize;
}SqStack;//初始化栈,容量是事先定义好的,定义初始的top标号为-1.
void InitStack(SqStack& S)
{S.elem = new char[STACK_INIT_SIZE];if (!S.elem)cout << "Overflow!" << endl;S.top = -1;S.stacksize = STACK_INIT_SIZE;
}//该函数用来释放栈的空间
void DestroyStack(SqStack& S)
{delete[]S.elem;S.top = -1;S.stacksize = 0;
}//若栈已满,该函数用来增加栈的空间
void increment(SqStack& S)
{char* newstack = new char[S.stacksize + STACK_INCREMENT];if (!newstack)cout << "Overflow!" << endl;for (int i = 0; i <= S.top; i++){newstack[i] = S.elem[i];}delete[]S.elem;S.elem = newstack;S.stacksize += STACK_INCREMENT;
}//该函数用来往栈里面增添元素,因为是入栈,所以栈顶元素的位置数加一,该元素成为新的栈顶元素
void Push(SqStack& S, char e)
{if (S.top == S.stacksize - 1)increment(S);S.elem[++S.top] = e;
}//该元素用来返回栈顶元素的值
char GetTopStack(SqStack& S)
{if (S.top == -1)cout << "Empty!" << endl;return S.elem[S.top];
}//该函数用来将元素出栈
void Pop(SqStack& S)
{if (S.top == -1)cout << "Empty!" << endl;S.top--;
}//主函数:输入字符串,向后遍历,如果元素是左括号则将左括号入栈,如果元素是右括号,则将左括号弹出栈顶,这样可以继续判断下一个左括号是否和右括号匹配。一旦右括号和左括号匹配不成功,那么修改标志表示括号匹配失败。其中,需要一开始就将‘#’压入栈,如果最后字符串遍历完了(也就是左括号都被消解完了)栈顶元素是‘#’,说明左括号和右括号匹配上不多不少刚刚好。
int main()
{SqStack s;int flag = 1;InitStack(s);Push(s, '#');char str[1000];cin >> str;int len = strlen(str);for (int i = 0; i < len; i++){if (str[i] == '(' || str[i] == '[' || str[i] == '{')Push(s, str[i]);else{if (str[i] == ')'){if (GetTopStack(s) != '('){flag = 0;break;}elsePop(s);}else if (str[i] == ']'){if (GetTopStack(s) != '['){flag = 0;break;}elsePop(s);}else if (str[i] == '}'){if (GetTopStack(s) != '{'){flag = 0;break;}elsePop(s);}}}if (GetTopStack(s) != '#')flag = 0;if (flag)cout << "括号匹配成功!" << endl;elsecout << "括号匹配失败!" << endl;return 0;
}

设top1和top2分别为栈1和2的栈顶元素的位置。

(1) 入栈主要语句

栈1的入栈语句

if(top2-top1==1)

{

cout<<“栈满”<<endl;

exit(0);

}

SPACE[++top1]=x; //设x为入栈元素。

栈2的入栈语句:

if(top2-top1==1)

{

cout<<“栈满”<<endl;

exit(0);

}

SPACE[--top2]=x;

出栈主要语句

1的出栈语句:

if(top1==-1)

{

cout<<“栈空”<<endl;

exit(0);

}

top1--;

return(SPACE[top1+1]); //返回出栈元素。

栈2的出栈语句:

if(top2==N)

{

cout<<“栈空”<<endl;

exit(0);

}

top2++;

return(SPACE[top2-1]);

  1. 栈满条件:top2-top1=1

栈空条件:top1=-1并且top2=N //top1=-1为左栈空,top2=N为右栈空

相关文章:

【数据结构】实验五:栈

实验五 栈 一、实验目的与要求 1&#xff09;熟悉栈的类型定义和基本操作&#xff1b; 2&#xff09;灵活应用栈解决具体应用问题。 二、实验内容 1、判断回文数&#xff0c;回文是指正读反读均相同的字符序列&#xff0c;如“1221”和“12321”均是回文&#xff0c;但“…...

⚡️⚡️Java多线程编程的高效、安全实践

⚡️ Java多线程编程的高效、安全实践⚡️ ☀️ 1 摘要☀️2 多线程编程基础☀️ 3 线程同步与互斥☀️ 4 并发集合类与原子操作☀️ 5 线程池与执行器框架☀️ 6 并发编程的最佳实践&#x1f304; 7 总结 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1…...

【云原生】Docker私有仓库registry

目录 1&#xff09;用docker容器运行registry私有仓库服务。 2&#xff09;运行私有仓库服务 3&#xff09;镜像重命名(要上传的镜像名需要注明私仓的ip) 4&#xff09;编辑docker配置文件(因为默认是拉取docker官方的镜像&#xff0c;需要重新指定) 5&#xff09;其他dock…...

第十四届蓝桥杯大赛青少年省赛C++组试题真题 2023年5月

一、选择题 第 1 题 单选题 C中&#xff0c;bool类型的变量占用字节数为 ( )。 A. 1 B. 2 C. 3 D. 4 第 2 题 单选题 以下关于C结构体的说法&#xff0c;正确的是 ( )。 A. 结构体中只能包含成员变量&#xff0c;不能包含成员函数 B. 结构体不能从另一个结构体继承 …...

GAN论文精读

标题:Generative Adversarial Nets 摘要: 简写:作者提出了一个framework通过一个对抗的过程&#xff0c;在这里面会同时训练两个模型。 第一个模型为生成模型G&#xff0c;是用来抓住整个数据的分布 第二个模型为辨别模型D&#xff0c;是用来估计一个样本是否从G中产生。 …...

数据结构:计数排序(详解)

思路详解&#xff1a; 1 找到数组中的最大值、最小值 2 开辟一个统计每个数据出现次数的数组&#xff08;总个数是最大值-最小值1&#xff0c;因为下标范围是0~最大值-最小值&#xff0c;闭区间统计个数要1&#xff09; 3 遇到一个元素&#xff0c;在此元素-最小值作为下标的…...

1 请使用js、css、html技术实现以下页面,表格内容根据查询条件动态变化。

1.1 创建css文件&#xff0c;用于编辑style 注意&#xff1a; 1.背景颜色用ppt的取色器来获取&#xff1a; 先点击ppt的形状轮廓&#xff0c;然后点击取色器&#xff0c;吸颜色&#xff0c;然后再点击形状轮廓的其他轮廓颜色&#xff0c;即可获取到对应颜色。 2.表格间的灰色线…...

react-native项目安卓版本升级 compileSdkVersion 29->31

因为 react-native-ble-manager添加过程及碰到的问题 依赖 https://github.com/innoveit/react-native-ble-manager 参考&#xff1a;https://blog.csdn.net/withings/article/details/71378562 iOS 按react-native-ble-manager 文档在 【Info.plist】加了key之后能正常使用…...

【学习笔记】目标跟踪领域SOTA方法比较

目录 前言方法1 TraDeS:2 FairMOT:3 SMILEtrack:4 ByteTrack: 前言 常用于行人跟踪的多目标跟踪数据集包括&#xff1a;MOT 15/16/17/20、PersonPath22等… 为更好比较现有SOTA算法的检测性能&#xff0c;本博客将针对在各数据集上表现较优的算法模型进行介绍。&#xff08;表…...

机器学习 深度学习编程笔记

sigmoid函数 def sigmoid(x):return 1.0 / (1np.exp((-x)))定义最小平方和损失函数 loss torch.nn.MSELoss()线性回归编程 如果不加噪音就成了正常的线性函数了&#xff0c;所以要加噪音。 torch.normal(0, 0.01, y.shape)torch.normal(0, 0.01, y.shape)是一个用于生成服从…...

18.背景轮播

背景轮播 html部分 <div class"container"><div class"slide active" style"background-image: url(./static/20180529205331_yhGyf.jpeg);"></div><div class"slide " style"background-image: url(./s…...

论文代码学习—HiFi-GAN(2)——鉴别器discriminator代码

文章目录 引言正文鉴别器多周期鉴定器多尺度鉴定器问题 总结 引言 这里翻译了HiFi-GAN这篇论文的具体内容&#xff0c;具体链接。这篇文章还是学到了很多东西&#xff0c;从整体上说&#xff0c;学到了生成对抗网络的构建思路&#xff0c;包括生成器和鉴定器。细化到具体实现的…...

Linux Shell 脚本编程学习之【第3章 正则表达式 (第二部分) grep命令】

第3章 正则表达式 &#xff08;第二部分&#xff09; 4 grep命令4.1 基本用法4.2 参考命令4.2.1 双引号4.2.2 -c 输出匹配行数4.2.3 -h 或 -l 不显示或只显示文件名4.2.4 -s 不显示错误信息4.2.5 -r 递归显示本级目录及下级目录4.2.6 -w 匹配完整词 -x 匹配完整行4.2.7 -q 退出…...

大语言模型LLM

目录 一、语言模型的发展 语言模型&#xff08;Language Model&#xff0c;LM&#xff09;目标是建模自然语言的概率分布&#xff0c;具体目标是构建词序列w1,w2,...,wm的概率分布&#xff0c;即计算给定的词序列作为一个句子出现可能的大小P(w1w2...wm)。但联合概率P的参数量…...

自学网络安全(黑客)的误区

前言 网络安全入门到底是先学编程还是先学计算机基础&#xff1f;这是一个争议比较大的问题&#xff0c;有的人会建议先学编程&#xff0c;而有的人会建议先学计算机基础&#xff0c;其实这都是要学的。而且这些对学习网络安全来说非常重要。 一、网络安全学习的误区 1.不要…...

@Conditional

Conditional Conditional 是 spring framework 中提供的一个条件注解&#xff0c;&#xff0c;满足条件就注入&#xff0c;不满足就不注入ioc Condtional 需要和 Condition接口 一起用&#xff1a; 返回true注入&#xff0c;返回false不注入&#xff0c;&#xff0c; 里面有一…...

【Linux】网络基础之TCP协议

目录 &#x1f308;前言&#x1f338;1、基本概念&#x1f33a;2、TCP协议报文结构&#x1f368;2.1、源端口号和目的端口号&#x1f369;2.2、4位首部长度&#x1f36a;2.3、32位序号和确认序号&#xff08;重点&#xff09;&#x1f36b;2.4、16位窗口大小&#x1f36c;2.5、…...

Java设计模式之装饰器(Decorator)模式

装饰器&#xff08;Decorator&#xff09;设计模式允许动态地将新功能添加到对象中&#xff0c;同时又不改变其结构。 什么是装饰器模式 装饰器&#xff08;Decorator&#xff09;模式通过将对象进行包装&#xff0c;以扩展其功能&#xff0c;而不需要修改其原始类。装饰器模…...

element ui树组件render-content 树节点的内容区的渲染另一种方式

直接上代码吧,不用h的写法。 <el-tree :data"data" node-key"id" default-expand-all :expand-on-click-node"false" :props"defaultProps":render-content"renderContentTree" node-click"handleNodeClick"&g…...

html a标签换行显示

文章目录 用css display属性不用css&#xff0c;可以用<br>标签换行示例 用css display属性 可以使用CSS的display属性来实现多个a标签每行显示一个。 HTML代码&#xff1a; <div class"link-container"><a href"#">Link 1</a>…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...