利用栈计算后缀表达式

上篇笔记我们已经知道了后缀表达式以及他的计算方法,本篇我会用代码实现利用栈计算后缀表达式。

计算步骤

初始化一个空栈。此栈用来对要运算的数字进出使用

如果遇到符号就把栈上的两个元素拿出来计算然后再压栈

遇到数字就压栈,遇到符号就出栈两个数字然后计算

直到表达式结束

代码实现

代码语言:javascript
复制
#include<stdio.h>
#include<stack>
using namespace std;
int PerformOperation(char c, int a, int b);
int Isnumber(char c);
bool IsOperator(char c);
int main()
{
 stack<char> S;
 char expression[50] = "562*+4-9+";
 int n = strlen(expression);
 int op1 = 0;
 int op2 = 0;
 for (size_t i = 0; i < n; i++)
 {
     if (IsOperator(expression[i]))
     {
         op1 = S.top();
         S.pop();
         op2 = S.top();
         S.pop();
     int res = PerformOperation(expression[i], op2, op1);
     S.push(res);
     }
     else if (Isnumber(expression[i]))
     {
         int operand = 0;
         operand = (operand * 10) + (expression[i] - '0');
         S.push(operand);
     }

}
int result = S.top();
printf("result = %d", result);
}
int PerformOperation(char c,int a,int b)
{
if (c == '+')
{
return a + b;
}
else if (c == '-')
{
return a - b;
}
else if (c == '*')
{
return a * b;
}
else if (c == '/')
{
return a / b;
}

}
int Isnumber(char c)
{
if (c>='0'||c<='9')
{
return 1;
}
else
{
return 0;
}
}
bool IsOperator(char c)
{
if (c == '+' || c == '-' || c == '*' || c == '/')
{
return true;
}
return false;
}

PerformOperation函数是通过传入的操作符来计算栈上元素的
Isnumber判断参数是否是数字
IsOperator判断是否是操作符

整体逻辑

根据字符串从左面开始扫面(我这里用的是for循环你也可以用其他的循环)
如果是操作符,则pop栈顶两个元素进行运算,并将运算的结果压入栈。
如果是数字,则把字符转成整数(因为后续要参加计算)并入栈,经过反复计算压栈,最后留在栈顶的就是我们要的结果。
eg:计算931-2*+52/+

image.png