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