顺序栈基本操作实验报告记录Word格式.docx
《顺序栈基本操作实验报告记录Word格式.docx》由会员分享,可在线阅读,更多相关《顺序栈基本操作实验报告记录Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
∙lvoidinitstack():
初始化堆栈
∙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
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!
S.base)
exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
returnOK;
}//InitStack
StatusStackEmpty(SqStack&
S)
if(S.base==S.top)
else
returnNO;
}
StatusClearStack(SqStack&
S)//把S置为空
if(S.base=S.top);
returnOK;
StatusDsetroyStack(SqStack&
S)//销毁栈S
S.base=NULL;
StatusPush(SqStack&
S,SElemTypee)
//插入元素e为新的栈顶元素
if(S.top-S.base>
=S.stacksize)
{
S.base=(SElemType*)realloc(S.base,
(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
S.base)//存储分配失败
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
}//Push
StatusPop(SqStack&
S,SElemType&
c)
//若栈不空,则删除S的栈顶元素,用c返回其值,并返回OK;
否则返回ERROR
if(S.top==S.base)
c=*--S.top;
}//Pop
StatusGetTop(SqStack&
e)
if(S.top==S.base)
returnNO;
e=*(S.top-1);
}//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;
S.top!
=S.base;
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)
s.base=(SElemType*)malloc(STACK_SIZE*sizeof(SElemType));
s.base)
exit(OVERFLOW);
s.top=s.base;
s.stacksize=STACK_SIZE;
StatusStackempty(SqStack&
if(s.base==s.top)
Statuspush_num(SqStack&
s,inte)
if(s.top-s.base>
=s.stacksize)
s.base=(SElemType*)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!
exit(OVERFLOW);
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
*s.top++=e;
Statuspush_operate(SqStack&
s,SElemTypee)
Statuspop_operate(SqStack&
if(s.top==s.base)
c=*--s.top;
Statuspop_num(SqStack&
charGetTop(SqStack&
c=*(s.top-1);
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对于优先级的判断按照书上给定的表格进行建立关系。
注意优先级的判断为这个实验最为关键的,也是最需要细心的地方。
只要有一个地方弄错,将导致整个实验都出错。