栈和队列的应用.docx

上传人:b****5 文档编号:8328751 上传时间:2023-01-30 格式:DOCX 页数:9 大小:94.98KB
下载 相关 举报
栈和队列的应用.docx_第1页
第1页 / 共9页
栈和队列的应用.docx_第2页
第2页 / 共9页
栈和队列的应用.docx_第3页
第3页 / 共9页
栈和队列的应用.docx_第4页
第4页 / 共9页
栈和队列的应用.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

栈和队列的应用.docx

《栈和队列的应用.docx》由会员分享,可在线阅读,更多相关《栈和队列的应用.docx(9页珍藏版)》请在冰豆网上搜索。

栈和队列的应用.docx

栈和队列的应用

数据结构实验报告

实验题目:

栈和队列的应用

实验内容:

算术表达式求值

实验目的:

掌握栈和队列的概念及工作原理,运用其原理完成实验题目中的内容。

实验要求:

为了使学生更好的掌握与理解课堂上老师所讲的概念与原理,实验前每个学生要认真预习所做的实验内容及编写源程序伪码(写在纸上及盘中均可)以便在实验课中完成老师所布置的实验内容。

设计原理:

主要函数类型:

queueA存储原来算术表达式

stackB存储转换成的后缀表达式

stackB1临时存储后缀表达式(B)

stackC表达式转化过程使用的过度栈,存储操作符

stackS存储数字(包括输入和计算过程中的数)

charch,QQ

intd1,d2,d3

主程序流程图:

Value函数的流程图:

注:

在value函数中还可以判定除数是否为0,为0则输出"0can'tbeadivisor!

",并终止程序。

详细程序:

#include

#include

#include

#include

usingnamespacestd;

voidtransition(queue&A,stack&B)//将中缀表达式转换成后缀表达式

{

stackC;//表达式转化过程使用的过度栈

charch;

while(!

A.empty())

{

ch=A.front();A.pop();

if(ch>='0'&&ch<='9')//判断数字

{

B.push(ch);//压栈

while(!

A.empty()&&A.front()>='0'&&A.front()<='9')

{

B.push(A.front());//其它位依次入栈至该数字结束}

A.pop();

B.push('');//用空格表示一个数字的结束}

elseif(ch=='(')C.push(ch);//判断为左括号

elseif(ch==')')//判断为右括号,把上一个左括号之前的所有操作符弹出存入B中,再弹出左括号

{

while(C.top()!

='(')

{

B.push(C.top());

C.pop();

}

C.pop();

}

elseif(ch=='+'||ch=='-')//判断为加减号,把上一个左括号之前的所有操作符弹出存入B中,再把+,-存入C中

{

while(!

C.empty()&&C.top()!

='(')

{

B.push(C.top());

C.pop();

}

C.push(ch);

}

elseif(ch=='*'||ch=='/')//判断为乘除号,弹出前面紧邻的*,/,再把这个*或/存入C中

{

while(C.top()=='*'||C.top()=='/')

{

B.push(C.top());

C.pop();

}

C.push(ch);

}

}

while(!

C.empty())//将C栈中所有运算符依次弹出存入B栈中

{

B.push(C.top());

C.pop();

}

//下面是将B倒序

while(!

B.empty())

{

A.push(B.top());B.pop();

}

while(!

A.empty())

{

B.push(A.front());A.pop();

}

return;

}

intvalue(stack&B)//后缀表达式求值

{

intd1,d2,d3;

stackS;

charch;

while(!

B.empty())

{

ch=B.top();

B.pop();

if(ch>='0'&&ch<='9')//将数字字符转换成数字

{

d1=0;

while(ch!

='')

{

d1=10*d1+ch-'0';//求出一个数字的数值

ch=B.top();B.pop();

}

S.push(d1);

}

else

{

d2=S.top();S.pop();

d3=S.top();S.pop();

switch(ch)//运算符操作

{

case'+':

S.push(d3+d2);

break;

case'-':

S.push(d3-d2);

break;

case'*':

S.push(d3*d2);

break;

case'/':

if(d2!

=0)

{

S.push(d3/d2);

}

else//0不能做除数

{

cout<<"0can'tbeadivisor!

"<

exit(0);

}

break;

}

}

}

returnS.top();

}

intmain()

{

charQQ;

queueA;//存储原来算术表达式

stackB,B1;//存储转换成的后缀表达式

cout<<"Pleaseinputyourexpession:

"<

while(QQ!

='\n')

{

QQ=getchar();

A.push(QQ);

};

transition(A,B);//前缀表达式转换成后缀表达式

cout<<"Thepofixexpessionis:

"<

while(!

B.empty())

{

cout<

B1.push(B.top());B.pop();//将B栈数据转移到B1

}

cout<

while(!

B1.empty())//数据返还给B

{

B.push(B1.top());B1.pop();

}

cout<<"Value:

"<

return0;

}

测试结果:

问题及解决方法:

几种线性表(队列、栈、数组、链表)从根本上说可以实现同一个功能,只是难易程度的问题,熟悉各线性表的特点有助于快速选择简单的方法。

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

当前位置:首页 > 小学教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1