栈和队列的应用.docx
《栈和队列的应用.docx》由会员分享,可在线阅读,更多相关《栈和队列的应用.docx(9页珍藏版)》请在冰豆网上搜索。
栈和队列的应用
数据结构实验报告
实验题目:
栈和队列的应用
实验内容:
算术表达式求值
实验目的:
掌握栈和队列的概念及工作原理,运用其原理完成实验题目中的内容。
实验要求:
为了使学生更好的掌握与理解课堂上老师所讲的概念与原理,实验前每个学生要认真预习所做的实验内容及编写源程序伪码(写在纸上及盘中均可)以便在实验课中完成老师所布置的实验内容。
设计原理:
主要函数类型:
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;
}
测试结果:
问题及解决方法:
几种线性表(队列、栈、数组、链表)从根本上说可以实现同一个功能,只是难易程度的问题,熟悉各线性表的特点有助于快速选择简单的方法。