利用栈计算后缀表达式

2023-10-11 21:09:40 浏览数 (2)

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

计算步骤

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

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

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

直到表达式结束

代码实现

代码语言: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/

0 人点赞