表达式有三种表示形式:前缀、中缀以及后缀。
我们平时使用的就是中缀表达式,如 A*B/C (运算符在运算数之间)
而编译器则是采用后缀表达式,如 AB*C/,AB+等
因此,用程序解决表达式,我们需输入后缀表达式
后缀表达式的运算过程: 从左到右依次遍历表达式中的每一项,如果遇到的是操作数,进栈;如果该项是运算符
<s>,则从栈顶处取两个元素B和A,计算A<s>B,并将结果压入栈中,继续扫描。等表达式遍历一遍后,栈中剩雨
元素即为表达式的值。
代码如下:
#include<iostream>
#include<cmath>
#include<stack>
using namespace std;
struct Calculator
{
void Run()//执行表达式计算
stack <double> s;
void AddOperand(double value);//操作数进栈
bool Get2Operands(double left,double right);//取值
void Operator(char op);//计算
void Clear()//清栈
};
void Calculator::Operator(char op)
{
double left,right,value;//左值,右值以及结果
bool judge;//用来标记判断是否取值成功
judge=Get2Operands(left,right);
if(judge==true)//取数成功
{
switch(op)
{
case '+':value=right+left;s.push(value);break;//加
case '-':value=right-left;s.push(value);break;//减
case '*':value=right*left;s.push(value);break;//乘
case '/':if(right==0.0)
{
cerr<<"Divide by 0"<<endl;
Clear();
}
else{
value=left/right;s.push(value);break;
}
}
else Clear();
}
}
bool Calculator::Get2Operands(double &left,double &right)
{
if(s.empty()==true)
{
cerr<<"栈空,缺右操作数"<<endl;
return false;
}
right=s.top();
s.pop();
if(s.empty()==true)
{
cerr<<"栈空,缺左操作数"<<endl;
return false;
}
left=s.top();
s.pop();
return true;
}
void Calculator::AddOperand(double value)
{
s.push(value);
}
void Calculator::Clear()
{
while(s.empty()==false)
{
s.pop();
}
}
void Calculator::Run()//读字符串,并求后缀表达式的值,以'#'结束
{
char ch;
double newwoperand;
while(cin>>ch&&ch!='#')
{
switch(ch)
{
case'+':case'-':case'*':case'/'://运算
Operator(ch);break;
default:cin.putback(ch);break;//将字符放回输入流
cin>>newoperand;//重新读取操作数
AddOperand(newoperand);//操作数入栈
}
}
}
如何将中缀表达式改为后缀,请看下一节