堆栈应用括号匹配实验Word格式.docx
《堆栈应用括号匹配实验Word格式.docx》由会员分享,可在线阅读,更多相关《堆栈应用括号匹配实验Word格式.docx(11页珍藏版)》请在冰点文库上搜索。
![堆栈应用括号匹配实验Word格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/6/034d82a1-509e-4373-96b8-c0eca1cc558e/034d82a1-509e-4373-96b8-c0eca1cc558e1.gif)
共有n行,每一行是一个测试结果,有四种结果:
0:
左右括号匹配正确{[(1+2)*3]-1}
-1:
左右括号配对次序不正确{[(1+2]*3)-1}
-2:
右括号多于左括号(1+2)*3)-1}
-3:
左括号多于右括号{[(1+2)*3-1]
6、输出样本
-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<
k<
=16
3、输出
对于每一组测试数据,每行输出转换后的结果,结果精度到小数点后3位
2
19.1252
15.12516
5、输出样本
10011.001
F.200
四、程序清单
#include<
iostream>
usingnamespacestd;
string>
#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];
intEmpty(Stack&
s,intn){
if(s.top==0){
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<
S1.length();
i++){
c=S1[i];
if(c=='
('
||c=='
)'
{'
}'
['
]'
)
ch2[m++]=c;
}
//把字符组S1的括号复制到ch2中
=m-1;
ch=ch2[i];
if(ch=='
||ch=='
Push(S,ch);
//左括号,进栈
){
num1++;
if((ch=='
&
S.base[S.top]=='
)||(ch=='
))
Pop(S,ch1);
//右括号匹配栈顶左括号,左括号出栈
else{
i=m-1;
return-1;
}//左右括号不匹配
if(Empty(S,n)&
m-1)
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<
<
x<
endl;
*******************************************************************************
#defineMax_Value100
typedefstructNum{
intbase[Max_Value];
}Num;
voidInitNum(Num&
S){
intPush(Num&
S,inta){
if(S.top>
=Max_Value)
return-1;
S.base[S.top]=a;
intPop(Num&
S,int&
a){
if(S.top<
=0)
a=S.base[S.top];
intEmpty(Num&
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<
char(e%10+65);
else
e;
voidNum_2(Num&
S,doublea,intk){
intb,i,e,j=0;
3;
Push(S,a*k);
b=a*k;
a=a*k-b;
for(j=1;
j<
=3;
j++){
if(S.base[j]>
char(S.base[j]%10+65);
S.base[j];
intt,k,m;
doublea,n;
NumS;
cin1.txt"
while(t--){
a>
k;
m=a;
n=a-m;
Num_1(S,m,k);
"
."
;
Num_2(S,n,k);
五、程序运行时截图
六、实验心得与体会(实验中遇到的问题及解决方案,或写点感想)
对于第一题,感觉还好,就是有时候感觉有点混,第二题较麻烦,问题大大小小不断,慢慢调试,查看,XX
指导教师批阅意见:
成绩评定:
指导教师签字:
年月日
备注:
注:
1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。