堆栈应用括号匹配实验.docx
- 文档编号:10362063
- 上传时间:2023-02-10
- 格式:DOCX
- 页数:11
- 大小:64.92KB
堆栈应用括号匹配实验.docx
《堆栈应用括号匹配实验.docx》由会员分享,可在线阅读,更多相关《堆栈应用括号匹配实验.docx(11页珍藏版)》请在冰豆网上搜索。
堆栈应用括号匹配实验
堆栈应用括号匹配实验
LT
编程实现判别表达式中括号是否正确匹配的算法
2、算法
顺序扫描算术表达式
若算术表达式扫描完成,此时如果栈空,则正确返回(0);如果栈未空,说明左括号多于右括号,返回(-3)
从算术表达式中取出一个字符,如果是左括号(‘(‘或‘[‘或‘{‘),则让该括号进栈(PUSH)
如果是右括号(‘)‘或‘]‘或‘}‘):
如果栈为空,则说明右括号多于左括号,返回(-2)
⑵、如果栈不为空,则从栈顶弹出(POP)一个括号:
若括号匹配,则转1继续进行判断;否则,说明左右括号配对次序不正确,返回(-1)
3、输入
第一行:
样本个数,假设为n。
第二到n+1行,每一行是一个样本(算术表达式串),共n个测试样本。
4、输入样本
4
{[(1+2)*3]-1}
{[(1+2]*3)-1}
(1+2)*3)-1}
{[(1+2)*3-1]
5、输出
共有n行,每一行是一个测试结果,有四种结果:
0:
左右括号匹配正确{[(1+2)*3]-1}
-1:
左右括号配对次序不正确{[(1+2]*3)-1}
-2:
右括号多于左括号(1+2)*3)-1}
-3:
左括号多于右括号{[(1+2)*3-1]
6、输出样本
0
-1
-2
-3
(二)数制转换
1、问题描述
对于任意十进制数转换为k进制,包括整数部分和小数部分转换。
整数部分采用除k求余法,小数部分采用乘k取整法例如x=19.125,求2进制转换
整数部分19,小数部分0.125
19/2=9…10.125*2=0.25…0
9/2=4…10.25*2=0.5…0
4/2=2…00.5*2=1…1
2/2=1…0
1/2=0…1
所以整数部分转为10011,小数部分转为0.001,合起来为10011.001
提示整数部分可用堆栈,小数部分可用队列实现
注意:
必须按照上述方法来实现数制转换,其他方法0分
2、输入
第一行输入一个t,表示下面将有t组测试数据。
接下来每行包含两个参数n和k,n表示要转换的数值,可能是非整数;k表示要转换的数制,1 3、输出 对于每一组测试数据,每行输出转换后的结果,结果精度到小数点后3位 4、输入样本 2 19.1252 15.12516 5、输出样本 10011.001 F.200 四、程序清单 #include usingnamespacestd; #include #defineMax_Size100 typedefstructStack{//定义栈 charbase[Max_Size]; inttop; }Stack; voidInitStack(Stack&S){//构造空栈 S.top=0; } intPush(Stack&S,charch){//元素进栈 S.top++; S.base[S.top]=ch; return1; } intPop(Stack&S,charch){//元素出栈 S.top--; ch=S.base[S.top]; return1; } intEmpty(Stack&s,intn){ if(s.top==0){ return1;} else{ return0;}} intPipei(Stack&S,stringS1){//匹配 inti,m=0,n=0,num=0,num1=0;charc,ch,ch1,ch2[100]; InitStack(S); for(i=0;i c=S1[i]; if(c=='('||c==')'||c=='{'||c=='}'||c=='['||c==']') ch2[m++]=c; } //把字符组S1的括号复制到ch2中 for(i=0;i<=m-1;i++){ ch=ch2[i]; if(ch=='('||ch=='{'||ch=='[') Push(S,ch);//左括号,进栈 if(ch==')'||ch=='}'||ch==']'){ num1++; if((ch==')'&&S.base[S.top]=='(')||(ch=='}'&&S.base[S.top]=='{')||(ch==']'&&S.base[S.top]=='[')) Pop(S,ch1);//右括号匹配栈顶左括号,左括号出栈 else{ i=m-1; return-1; }//左右括号不匹配 if(Empty(S,n)&&i return-2;//右括号多于左括号 } } if(! Empty(S,n))//左括号多于右括号 return-3; if(Empty(S,n))//左右括号匹配 return0; } intmain(){ StackS; stringP; intt,x; //freopen("cin.txt","r",stdin); cin>>t; while(t--) { cin>>P; x=Pipei(S,P); cout< } return0; } ******************************************************************************* #include usingnamespacestd; #defineMax_Value100 typedefstructNum{ intbase[Max_Value]; inttop; }Num; voidInitNum(Num&S){ S.top=0; } intPush(Num&S,inta){ if(S.top>=Max_Value) return-1; S.top++; S.base[S.top]=a; return1; } intPop(Num&S,int&a){ if(S.top<=0) return-1; a=S.base[S.top]; S.top--; return1; } intEmpty(Num&S){ if(S.top==0) return1; else return0; } voidNum_1(Num&S,inta,intk){ InitNum(S); inte; while(a){ Push(S,a%k); a=a/k;} while(! Empty(S)){ Pop(S,e); if(e>=10) cout< else cout< } voidNum_2(Num&S,doublea,intk){ InitNum(S); intb,i,e,j=0; for(i=0;i<3;i++){ Push(S,a*k); b=a*k; a=a*k-b; } for(j=1;j<=3;j++){ if(S.base[j]>=10) cout< else cout< } } intmain(){ intt,k,m; doublea,n; NumS; //freopen("cin1.txt","r",stdin); cin>>t; while(t--){ cin>>a>>k; m=a; n=a-m; Num_1(S,m,k); cout<<"."; Num_2(S,n,k); cout< } return0;} 五、程序运行时截图 六、实验心得与体会(实验中遇到的问题及解决方案,或写点感想) 对于第一题,感觉还好,就是有时候感觉有点混,第二题较麻烦,问题大大小小不断,慢慢调试,查看,XX 指导教师批阅意见: 成绩评定: 指导教师签字: 年月日 备注: 注: 1、报告内的项目或内容设置,可根据实际情况加以调整和补充。 2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 堆栈 应用 括号 匹配 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)