上篇笔记我们已经知道了后缀表达式以及他的计算方法,本篇我会用代码实现利用栈计算后缀表达式。
计算步骤
初始化一个空栈。此栈用来对要运算的数字进出使用
如果遇到符号就把栈上的两个元素拿出来计算然后再压栈
遇到数字就压栈,遇到符号就出栈两个数字然后计算
直到表达式结束
代码实现
#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/+