栈及其应用.docx
- 文档编号:24466250
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:9
- 大小:44.89KB
栈及其应用.docx
《栈及其应用.docx》由会员分享,可在线阅读,更多相关《栈及其应用.docx(9页珍藏版)》请在冰豆网上搜索。
栈及其应用
贵州大学计算机科学与技术学院
计算机科学与技术系上机实验报告
课程名称:
数据结构
班级:
实验日期:
2013-4-22
姓名:
学号:
指导教师:
实验序号:
二
实验成绩:
一、实验名称
栈及其应用
二、实验目的及要求
1、熟悉栈的原理和实现方式;
2、理解使用栈消除函数递归调用的原理;
3、掌握后缀表达式计算的方法。
三、实验环境
VisualStudio2010
四、实验内容
1、栈实现阶乘函数;
2、栈实现后缀表达式的计算。
五、算法描述及实验步骤
函数调用栈的结构如下:
第n层调用
(当前函数局部变量空间)
第n-1层调用
(当前函数的主调函数变量空间)
…
第1层调用
主函数局部变量空间
函数调用的栈空间
使用栈消去递归的算法框架如下:
初始化栈;
将完整问题参数压栈;
while(栈非空)
{
取出栈顶元素所描述的问题
如果可以直接解决,则直接解决
否则分解为子问题压栈
}
后缀表达式是运算符在运算数之后的一种表达式存储的数据结构,不需要比较运算符优先级别,只需要每次读到运算数时压栈,读到运算符时将运算数出栈,将结果压栈即可。
最后的运算结果存放在栈底。
实验步骤
1、创建结构体栈Stack:
其中有栈顶指针,栈底指针。
2、创建顺序栈SqStack:
其中有数据域data,next指针。
3、从程序中写出所要求的阶乘值(用栈求阶乘函数)。
4、在程序中用数组表示后缀表达式,从控制面板输出结果(用栈实现后缀表达式的计算)。
5、调试运行。
六、调试过程及实验结果
1、用栈实现阶乘函数结果如下:
2、用栈实现后缀表达式计算结果如下:
七、总结
本次试验是用栈来完成阶乘函数与后缀表达式的计算,从中加深了对栈原理的理解并懂得如何用栈来解决一些实际问题,利用栈是一种递归的思想,学会怎样使用栈,如何将其运用到编程实践中去是一件值得非常重视的问题,希望在以后的学习中不断将其运用到实处。
八、附录
1、用栈实现阶乘函数代码如下:
#include"iostream"
#include
usingnamespacestd;
typedefstructSqStack
{
chardata;
structSqStack*next;
}SqStack;//链元素
typedefstructStack
{
structSqStack*base;//栈底指针
structSqStack*top;//栈顶指针
}Stack;//栈
StackS;//栈的全局对象S
intAj;
voidcreatstack()
{
S.top=S.base=NULL;
}//建立初始化链栈
voidpush(Stack&S,inte)
{
SqStack*Q;
Q=(SqStack*)malloc(sizeof(SqStack));
if(!
Q)exit(0);
Q->next=S.top;//前一结点置在新建结点之后
S.top=Q;//栈顶指针往上移动
S.top->data=e;
++Aj;//记录字符的个数
}//左括号入栈
charPop(Stack&S)
{
chare;
SqStack*q;//辅助指针
e=S.top->data;
q=S.top->next;
free(S.top);
S.top=q;//栈顶指针下移
returne;
}//括号出栈
intcheck()
{
intn=5;//表示求多少数的阶乘
intNum=1;
for(inti=n;i>=1;i--)
{
push(S,i);
}
for(Aj;Aj>0;Aj--)
{
Num=Num*Pop(S);
}
returnNum;
}
voidmain()//主函数
{
intReturn;
creatstack();//调用初始化栈
Return=check();
cout<<"输出5的阶乘为:
"< cout< } 2、用栈实现后缀表达式计算代码如下: //输出运算结果为: 15 #include"iostream" #include usingnamespacestd; typedefstructSqStack { intdata; structSqStack*next; }SqStack;//链元素 typedefstructStack { structSqStack*base;//栈底指针 structSqStack*top;//栈顶指针 }Stack;//栈 StackS;//栈的全局对象S voidcreatstack() { S.top=S.base=NULL; }//建立初始化链栈 voidpush(Stack&S,inte) { SqStack*Q; Q=(SqStack*)malloc(sizeof(SqStack)); if(! Q)exit(0); Q->next=S.top;//前一结点置在新建结点之后 S.top=Q;//栈顶指针往上移动 S.top->data=e; } intPop(Stack&S) { inte; SqStack*q;//辅助指针 e=S.top->data; q=S.top->next; free(S.top); S.top=q;//栈顶指针下移 returne; }//括号出栈 intcheck() { intReturn; inta=0; intRet; charstring[]={'1','_','0','5','1','_','0','1','_','5','5','2','^','+','-','*','/','='}; charch,sh,*st,*stt;//ch表示前一个字符,sh表示后一个字符 cout<<"后缀表达式为: "< st=stt=string;//分别将st,stt指向输入字符串的首地址 ch=*st;//将字符串的第一个字符赋给字符变量ch sh=*(++stt); while(ch! ='=')//判断字符是否为结束标志 {//"_"即下划线表示: 当输入为2位数或2位数以上时,中间用下划线隔开。 if(ch! ='+'||ch! ='-'||ch! ='*'||ch! ='/'||ch! ='^')//判断是否满足入栈和出栈条件 { if((ch>='0'&&ch<='9')||sh=='_') { if(ch>='0'&&ch<='9'&&sh=='_')//将字符型转化为整型,之后压栈 a=(a+ch-48)*10;//1的ACSII码为48; else { a=(a+ch-48); push(S,a); a=0; } } } if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='^')//判断遇到运算符就从栈中出来2个数进行相应的运算 { intfirst=Pop(S); intsecond=Pop(S); switch(ch) { case'+': {Ret=first+second;push(S,Ret);}break; case'-': {Ret=first-second;push(S,Ret);}break; case'*': {Ret=first*second;push(S,Ret);}break; case'/': {Ret=first/second;push(S,Ret);}break; case'^': { inttemp=1; for(first;first>=1;first--) { temp=temp*second; } push(S,temp); }break; } } ch=*(++st);//字符往后移动 sh=*(++stt); } if(ch=='=') Return=Pop(S); returnReturn; } voidmain()//主函数 { intResult; creatstack();//调用初始化栈 Result=check(); cout<<"此表达式的结果为: "< }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 及其 应用