实验03堆栈应用括号匹配实验报告Word下载.docx
- 文档编号:20839659
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:14
- 大小:37.35KB
实验03堆栈应用括号匹配实验报告Word下载.docx
《实验03堆栈应用括号匹配实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《实验03堆栈应用括号匹配实验报告Word下载.docx(14页珍藏版)》请在冰豆网上搜索。
熟练使用堆栈实现括号匹配算法
三、实验内容
本次实验有两项内容:
(一)堆栈应用括号匹配
1、问题描述
一个算术表达式中包括圆括号、方括号和花括号三种形式的括号
编程实现判别表达式中括号是否正确匹配的算法
2、算法
顺序扫描算术表达式
若算术表达式扫描完成,此时如果栈空,则正确返回(0);
如果栈未空,说明左括号多于右括号,返回(-3)
从算术表达式中取出一个字符,如果是左括号(‘(‘或‘[‘或‘{‘),则让该括号进栈(PUSH)
如果是右括号(‘)‘或‘]‘或‘}‘):
2、如果栈为空,则说明右括号多于左括号,返回(-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、输出样本
-1
-2
-3
(二)数制转换
对于任意十进制数转换为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
四、程序清单
代码1:
#include<
iostream>
usingnamespacestd;
cstring>
#defineMaxsize100
ClassStack
{
public:
char*data;
inttop;
Stack()
{
top=0;
data=newchar[Maxsize];
}
intpush(chara)
data[top++]=a;
return1;
charpop()
top--;
returndata[top];
~Stack()
delete[]data;
};
intmain()
charData[Maxsize];
inti,jun=2;
freopen("
cin.txt"
"
r"
stdin);
cin>
>
i;
while(i)
Stacks1;
Data;
for(intj=0;
j<
strlen(Data)&
&
jun!
=-1&
jun!
=0;
)
switch(Data[j])
case'
{'
:
['
('
s1.push(Data[j]);
j++;
break;
}'
if(s1.top!
=0)
if(s1.pop()=='
else
jun=-1;
cout<
<
jun<
endl;
jun=0;
]'
)'
default:
if(s1.top==0)
0<
elseif(jun!
=-1)
chara=s1.pop();
if(a=='
||a=='
-3<
-2<
jun=2;
i--;
return0;
}
2:
usingnamespacestd;
constintLength=20;
voidTran(inte)
switch(e)
case10:
cout<
'
A'
;
break;
case11:
B'
case12:
C'
case13:
D'
case14:
E'
case15:
F'
//栈
structSqStack
int*top;
int*base;
intstacksize;
boolInitStack(SqStack&
S)
S.base=(int*)newint[Length*sizeof(int)];
if(!
S.base)
returnfalse;
S.top=S.base;
S.stacksize=Length;
returntrue;
boolDestroyStack(SqStack&
deleteS.base;
boolPush(SqStack&
S,inte)
*S.top++=e;
boolPop(SqStack&
S,int&
e)
if(S.top==S.base)
e=*--S.top;
boolStackEmpty(SqStack&
if(S.base==S.top)
returntrue;
//队列
structSqQueue
intfront;
intrear;
boolInitQueue(SqQueue&
Q)
Q.base=(int*)newint[Length*sizeof(int)];
Q.base)
Q.front=Q.rear=0;
boolEnQueue(SqQueue&
Q,inte)
Q.base[Q.rear]=e;
Q.rear++;
boolDeQueue(SqQueue&
Q,int&
if(Q.front==Q.rear)
e=Q.base[Q.front];
Q.front++;
boolDestroyQueue(SqQueue&
deleteQ.base;
//转换数制
voidConversion(doubletest,intradix)
intInteger=test,e,i,d;
doubleDecimal=test-Integer;
SqStackIntegerStack;
SqQueueDecimalQueue;
InitStack(IntegerStack);
while(Integer)
Push(IntegerStack,Integer%radix);
Integer/=radix;
while(!
StackEmpty(IntegerStack))
Pop(IntegerStack,e);
if(radix<
=10)
cout<
e;
else
Tran(e);
"
."
InitQueue(DecimalQueue);
i=3;
EnQueue(DecimalQueue,int(Decimal*radix));
Decimal=(Decimal*radix-int(Decimal*radix));
i--;
DeQueue(DecimalQueue,d);
if(d<
d;
Tran(d);
DestroyStack(IntegerStack);
DestroyQueue(DecimalQueue);
intmain()
inti,t,radix;
doubletestData;
//freopen("
cin2.txt"
t;
for(i=0;
i<
t;
i++)
cin>
testData>
radix;
Conversion(testData,radix);
return0;
五、程序运行时截图
1:
六、实验心得与体会(实验中遇到的问题及解决方案,或写点感想)
多练习,多思考。
指导教师批阅意见:
成绩评定:
指导教师签字:
年月日
备注:
注:
1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 03 堆栈 应用 括号 匹配 报告