您的位置:首页 > 编程语言 > C语言/C++

逆波兰表达式的计算问题

2016-04-04 10:28 471 查看
逆波兰表达式分两步,首先要把中缀表达式转换成后缀表达式,然后根据后缀表达式求值。

#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<
ab97
/span>[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;
}`
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息