顺序栈基本操作实验报告Word文档下载推荐.docx

上传人:b****1 文档编号:3802637 上传时间:2023-05-02 格式:DOCX 页数:16 大小:18.04KB
下载 相关 举报
顺序栈基本操作实验报告Word文档下载推荐.docx_第1页
第1页 / 共16页
顺序栈基本操作实验报告Word文档下载推荐.docx_第2页
第2页 / 共16页
顺序栈基本操作实验报告Word文档下载推荐.docx_第3页
第3页 / 共16页
顺序栈基本操作实验报告Word文档下载推荐.docx_第4页
第4页 / 共16页
顺序栈基本操作实验报告Word文档下载推荐.docx_第5页
第5页 / 共16页
顺序栈基本操作实验报告Word文档下载推荐.docx_第6页
第6页 / 共16页
顺序栈基本操作实验报告Word文档下载推荐.docx_第7页
第7页 / 共16页
顺序栈基本操作实验报告Word文档下载推荐.docx_第8页
第8页 / 共16页
顺序栈基本操作实验报告Word文档下载推荐.docx_第9页
第9页 / 共16页
顺序栈基本操作实验报告Word文档下载推荐.docx_第10页
第10页 / 共16页
顺序栈基本操作实验报告Word文档下载推荐.docx_第11页
第11页 / 共16页
顺序栈基本操作实验报告Word文档下载推荐.docx_第12页
第12页 / 共16页
顺序栈基本操作实验报告Word文档下载推荐.docx_第13页
第13页 / 共16页
顺序栈基本操作实验报告Word文档下载推荐.docx_第14页
第14页 / 共16页
顺序栈基本操作实验报告Word文档下载推荐.docx_第15页
第15页 / 共16页
顺序栈基本操作实验报告Word文档下载推荐.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

顺序栈基本操作实验报告Word文档下载推荐.docx

《顺序栈基本操作实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《顺序栈基本操作实验报告Word文档下载推荐.docx(16页珍藏版)》请在冰点文库上搜索。

顺序栈基本操作实验报告Word文档下载推荐.docx

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对于优先级的判断按照书上给定的表格进行建立关系。

注意优先级的判断为这个实验最为关键的,也是最需要细心的地方。

只要有一个地方弄错,将导致整个实验都出错。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2