如: 后缀表达式 "2 3 +=" 等价于中缀表达式: "2+3=" 运算结果为: 5
后缀表达式 "2 5 6 * + 3 -=" 等价于中缀表达式: "2+5*6-3=" 运算结果为: 29
后缀表达式 "1 2 + 8 2 - 7 4 - / *=" 等价于中缀表达式: "(1+2)*(8-2)/(7-4)=" 运算结果为: 6
代码如下:
int priority(char f)//判断‘+’、‘-’、‘*’的优先级
{
if('+' == f || '-' == f)
{
return 1;
}
return 2;
}
int calculate(int num1,int num2,int sign)//计算
{
if('+' == sign)
{
return num1 + num2;
}
else if('-' == sign)
{
return num1 - num2;
}
else if('*' == sign)
{
return num1 * num2;
}
return 0;
}
#include <string.h>
int solve(char* s ) {
// write code here
int num_stack[100] = {0};//保存数字和符号(符号对应ASII值)
char sign_stack[100] = {0};//保存符号
int num_top = -1;//数字栈下标
int sign_top = -1;//符号栈下标
int i = 0;
int num = 0;//保存数字以及计算结果
while(i < strlen(s))
{
//字符转数字并入栈
if(s[i] >= '0' && s[i] <= '9')
{
num = 0;
while(s[i] >= '0' && s[i] <= '9')
{
num = num*10 + (s[i] - '0');
i++;
}
num_stack[++num_top] = num;
i--;//上面的小循环i在后一位,但大循环还有一次i++,所以要往回退一个位置
}
//符号入栈 ‘)’不入栈
else if('(' == s[i])
{
sign_stack[++sign_top] = s[i];
}
else if (')' == s[i])
{
while(sign_top != -1)
{
if(sign_stack[sign_top] == '(')
{
sign_top--;//每遇到一个‘)’去掉符号栈的一个'('
break;
}
else //()之间的符号出符号栈入数字栈
{
num_stack[++num_top] = sign_stack[sign_top];
}
sign_top--;
}
}
else if ('+' == s[i] || '-' == s[i] || '*' == s[i])
{
if(-1 == sign_top)//若符号栈为空,遇到符号之间入栈
{
sign_stack[++sign_top] = s[i];
}
else //若符号栈不为空,则判断当前符号与前一个符号的优先级
{
while(sign_top > -1)
{
//若当前符号优先级高于前一符号,则当前符号入符号栈
//否则前一符号出符号栈入数字栈,当前符号入符号栈
if('(' == sign_stack[sign_top] || priority(sign_stack[sign_top]) < priority(s[i]))
{
break;
}
else
{
num_stack[++num_top] = sign_stack[sign_top];
}
sign_top--;
}
sign_stack[++sign_top] = s[i];
}
}
i++;
}
//将符号栈中剩余的符号出栈,入数字栈
while(sign_top != -1)
{
num_stack[++num_top] = sign_stack[sign_top--];
}
while(num_top >= 2)
{
//找到数字栈中第一个符号的位置
for(i = 0;i < num_top;i++)
{
if(num_stack[i] == '+' || num_stack[i] == '-' || num_stack[i] == '*')
{
break;
}
}
//计算
num = calculate(num_stack[i-2], num_stack[i-1], num_stack[i]);
num_stack[i-2] = num;
//去除计算过的数字和符号
for(i = i - 1;i < num_top;i++)
{
num_stack[i] = num_stack[i+2];
}
num_top -= 2;
}
return num;
}