顺序栈基本操作实验报告Word文档下载推荐.docx
- 文档编号:3802637
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:16
- 大小:18.04KB
顺序栈基本操作实验报告Word文档下载推荐.docx
《顺序栈基本操作实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《顺序栈基本操作实验报告Word文档下载推荐.docx(16页珍藏版)》请在冰点文库上搜索。
lintMake_str():
语法检查并计算
lintpush_operate(intoperate):
将操作码压入堆栈
lintpush_num(doublenum):
将操作数压入堆栈
lintprocede(intoperate):
处理操作码
lintchange_opnd(intoperate):
将字符型操作码转换成优先级
lintpush_opnd(intoperate):
lintpop_opnd():
将操作码弹出堆栈
lintcaculate(intcur_opnd):
简单计算+,-,*,/
ldoublepop_num():
弹出操作数
四、实验步骤
(描述实验步骤及中间的结果或现象。
在实验中做了什么事情,怎么做的,发生的现象和中间结果)
第一题:
#include<
iostream>
usingnamespacestd;
#defineSTACK_INIT_SIZE100//存储空间初始分配量
#defineSTACKINCREMENT10//存储空间分配增量
#defineOVERFLOW-1
#defineOK1
#defineNO-1
#defineNULL0
typedefintStatus;
typedefcharSElemType;
typedefstruct
{
SElemType*base;
//在栈构造之前和销毁之后,base的值为NULL
SElemType*top;
//栈顶指针
intstacksize;
//当前已分配的存储空间,以元素为单位
}SqStack;
StatusInitstack(SqStack&
S)//构造一个空栈S
=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!
exit(OVERFLOW);
=;
=STACK_INIT_SIZE;
returnOK;
}//InitStack
StatusStackEmpty(SqStack&
S)
if==
else
returnNO;
}
StatusClearStack(SqStack&
S)//把S置为空
if=;
returnOK;
StatusDsetroyStack(SqStack&
S)//销毁栈S
=NULL;
StatusPush(SqStack&
S,SElemTypee)
//插入元素e为新的栈顶元素
if{
=(SElemType*)realloc,
+STACKINCREMENT)*sizeof(SElemType));
//存储分配失败
=+;
+=STACKINCREMENT;
}
*++=e;
}//Push
StatusPop(SqStack&
S,SElemType&
c)
//若栈不空,则删除S的栈顶元素,用c返回其值,并返回OK;
否则返回ERROR
c=*;
}//Pop
StatusGetTop(SqStack&
e)
if==
returnNO;
e=*;
}//GetTop
intmain()
SqStackS;
Initstack(S);
cout<
<
"
输入要压到栈中的元素!
endl;
charc;
while((c=getchar())!
='
\n'
)
{
Push(S,c);
GetTop(S,c);
栈顶元素为:
c<
//ClearStack(S);
//DsetroyStack(S);
for(inti=0;
!
=;
i++)
{
Pop(S,c);
cout<
栈中第"
i+1<
元素的值:
;
}
return0;
第二题:
#include<
#defineSTACK_SIZE100
#defineSTACKINCREMENT10
#defineNO0
}SqStack;
charGetTop(SqStack&
s);
StatusInitstack(SqStack&
Statuspush_operate(SqStack&
s,SElemTypee);
Statuspush_num(SqStack&
s,inte);
StatusStackempty(SqStack&
Statuspop_num(SqStack&
s,int&
c);
Statuspushoperate(SElemTypeoperate);
Statuspushnum(SElemTypenum);
Statuscaculate(SElemTypea,SElemTypeoperate,SElemTypeb);
Statuspop_operate(SqStack&
s,SElemType&
Statuschange(SElemTypee);
charPrecede(SElemTypea,SElemTypeb);
charOperatecxz();
intm;
m=Operatecxz();
m<
Statuschange(SElemTypee)
m=e-48;
returnm;
s)
=(SElemType*)malloc(STACK_SIZE*sizeof(SElemType));
exit(OVERFLOW);
=STACK_SIZE;
StatusStackempty(SqStack&
Statuspush_num(SqStack&
s,inte)
=(SElemType*)realloc,+STACKINCREMENT)*sizeof(SElemType));
if(!
exit(OVERFLOW);
=+;
+=STACKINCREMENT;
Statuspush_operate(SqStack&
s,SElemTypee)
Statuspop_operate(SqStack&
Statuspop_num(SqStack&
charGetTop(SqStack&
returnc;
Statuscaculate(inta,SElemTypeoperate,intb)
ints;
if(operate=='
+'
s=a+b;
-'
s=a-b;
*'
s=a*b;
/'
s=a/b;
returns;
StatusIn(SElemTypec)
if(c=='
||c=='
#'
('
)'
if(c>
0'
&
9'
return-1;
charPrecede(SElemTypea,SElemTypeb)
if(a=='
||a=='
if(b=='
||b=='
return'
>
'
'
if(a=='
return'
charOperatecxz()
SqStackOperate,Num;
charc,e,x;
intnum,a,b,flat=1,sz=0;
Initstack(Operate);
push_operate(Operate,'
);
Initstack(Num);
c=getchar();
while(c!
||GetTop(Operate)!
if(In(c)==-1)
cout<
inputerror!
flat=0;
break;
if(In(c)!
=1)
if(sz==0)
{
num=change(c);
sz=1;
c=getchar();
continue;
}
if(sz==1)
num=num*10+change(c);
c=getchar();
continue;
else
push_num(Num,num);
sz=0;
x=GetTop(Operate);
switch(Precede(GetTop(Operate),c))
case'
:
{
push_operate(Operate,c);
c=getchar();
break;
}
pop_operate(Operate,e);
pop_num(Num,a);
pop_num(Num,b);
push_num(Num,caculate(b,e,a));
pop_operate(Operate,e);
if(e!
flat=0;
if(flat==1)
pop_num(Num,a);
returna;
if(flat==0)
return0;
五.实验结果与讨论
(描述最终得到的结果,并进行分析说明,可能的误差原因)
1把主函数中的ClearStack(S);
DsetroyStack(S)注释掉的结果:
2不把ClearStack(S)注释掉,把栈清空:
3不把DsetroyStack(S)注释掉,即销毁栈:
出现一堆乱码,说明销毁成功。
第二题的输出:
1正常输入表达式则输出:
2如果输入的表达式出错则输出:
六.实验总结:
1在写主函数时,如果是用voidmain的形式,那么可以不用有返回值,如果是intmain或|statusmain的话,要有返回值,既末尾要有return语句。
2有时候写的没有出现问题,但运行的结果是Pressanukeytocontinue。
程序肯定有错,但为什么会出现这种问题呢。
3分号的忘记那还是很经常的,要加强注意。
4原本把ClearStack(S);
DsetroyStack(S)放在for循环之后,检查不出ClearStack(S);
DsetroyStack(S)的函数是否正确。
把它们for循环之前,GetTop(S,c)语句之后,再利用注释等的,就可以很明显的看出栈是否被清空或销毁。
5在做表达式的计算的时候一定要注意何时入栈何时出栈。
如果如栈与出栈的情况判断不清楚就无法得出答案。
6在定义栈的时候Num中的元素最好使用int类型的而不是char类型的。
因为这样会简化charOperatecxz()的计算复杂度。
7对于表达式的判错情况,根据题目中的提示对每次读入的字符进行判断。
8对于不是个位数的计算,首先用了个
把每个字符转化成int型,然后再用sz作为标记直到读入的数不是数字为止。
此时再将之前读入的数num压入Num栈中。
9对于优先级的判断按照书上给定的表格进行建立关系。
注意优先级的判断为这个实验最为关键的,也是最需要细心的地方。
只要有一个地方弄错,将导致整个实验都出错。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 顺序 基本 操作 实验 报告
![提示](https://static.bingdoc.com/images/bang_tan.gif)