逆波兰表达式分两步,首先要把中缀表达式转换成后缀表达式,然后根据后缀表达式求值。
#include <stdio.h>
#include <stack>
#include <stdlib.h>
#include <string>
using namespace std;
//这个是相应的函数声明
char* MidExpressionToLastExpression(char * szExpression);
int GetAnswerByLastExpression(char* szExpression);
int gLength=0;//统计输入的数字字符个数(包括我们人为添加的\0)
int main()
{
printf("请输入一个中缀表达式");
char* szExpression=new char;
scanf("%s",szExpression);
char* pszTmp=MidExpressionToLastExpression(szExpression);
int result=GetAnswerByLastExpression(pszTmp);
printf("计算结果为%d",result);
system("pause");
}
//中缀表达式转换为后缀表达式
char* MidExpressionToLastExpression(char * szExpression)
{
stack<char>szStack;//这个栈用作中间栈的作用,用于存放临时的运算符及数字
stack<char>szResult;//这个栈是最终结果栈
char* tmp=szExpression;
int nlength=strlen(szExpression);
gLength=nlength;
//处理一个单位数的运算
for (int i=0;i<nlength;i++)
{
char chtop='<';
if(szStack.size())
{
chtop=szStack.top();
}else{
if(*(szExpression+i)-'0'<=9&&*(szExpression+i)-'0'>=0)
{
}else{
szStack.push(*(szExpression+i));
chtop=szStack.top();
i++;
}
}
if(*(szExpression+i)-'0'<=9&&*(szExpression+i)-'0'>=0)
{
int j=i+1;
szResult.push(*(szExpression+i));
while(*(szExpression+j)-'0'<=9&&*(szExpression+j)-'0'>=0)
{
szResult.push(*(szExpression+j));
i=j;
j++;
}
szResult.push('\0');//这里加\0是便于后面的计算,这样计算就不仅仅是个位数字的计算
gLength++;
}else{
if(chtop=='+'||chtop=='-'||chtop=='(')
{
if(*(szExpression+i)=='*'||*(szExpression+i)=='/'||*(szExpression+i)=='(')
{
//当前优先级小于要入栈的元素,则入栈
szStack.push(*(szExpression+i));
}else if(*(szExpression+i)=='+'||*(szExpression+i)=='-')
{
szStack.push(*(szExpression+i));
}else if(*(szExpression+i)==')')
{
char tmptop=szStack.top();
while(tmptop!='(')
{
szResult.push(tmptop);
szResult.push('\0'); //这里加\0是便于后面的计算,这样计算就不仅仅是个位数字的计算
gLength++;
szStack.pop();
tmptop=szStack.top();
}
szStack.pop();
}
}else{
if(*(szExpression+i)=='(')
{
szStack.push(*(szExpression+i));
}else{
char tmptop=szStack.top();
szResult.push(tmptop);
szResult.push('\0');//这里加\0是便于后面的计算,这样计算就不仅仅是个位数字的计算
gLength++;
szStack.pop();
while(szStack.size())
{
szResult.push(szStack.top());
szResult.push('\0');//这里加\0是便于后面的计算,这样计算就不仅仅是个位数字的计算
gLength++;
szStack.pop();
}
szStack.push(*(szExpression+i));
}
}
}
}
//最后将临时栈的运算符输出
while(szStack.size())
{
szResult.push(szStack.top());
szResult.push('\0');
szStack.pop();
}
int nlen=szResult.size();
char *presult=new char[nlen];
while(szResult.size())
{
*(presult+nlen-1)=szResult.top();
szResult.pop();
nlen--;
}
return presult;
}
//根据后缀表达式求值
int GetAnswerByLastExpression(char* szExpression)
{
string strNum=szExpression;
int tmplength=0;
stack<int>stNum;
int resultNum=0;
while(tmplength<gLength)
{
if(strNum=="*"||strNum=="-"||strNum=="/"||strNum=="+")
{
tmplength+=strNum.length()+1;
int num2=stNum.top();
stNum.pop();
int num1=stNum.top();
stNum.pop();
if(strNum=="*")
{
resultNum=num2*num1;
}else if(strNum=="/")
{
resultNum=num1/num2;
}else if(strNum=="+")
{
resultNum=num1+num2;
}else if(strNum=="-"){
resultNum=num1-num2;
}
stNum.push(resultNum);
szExpression+=strNum.length()+1;
}else{
tmplength+=strNum.length()+1;
stNum.push(atoi(strNum.c_str()));
szExpression+=strNum.length()+1;
}
strNum=szExpression;
}
return resultNum;
}`