📜  堆栈 | Set 4(后缀表达式的评估)(1)

📅  最后修改于: 2023-12-03 15:37:49.666000             🧑  作者: Mango

堆栈 | Set 4(后缀表达式的评估)

简介

本文将介绍如何使用堆栈来计算后缀表达式的值。

后缀表达式,也称为逆波兰表达式(RPN),是一种使用后缀表示算法表示算术表达式的方法,其中运算符立即跟在其操作数之后。例如,“3+4”可以表示为“3 4 +”。

使用后缀表达式的优点在于,可以避免使用括号,因为操作的优先级由运算符的位置来决定。此外,计算后缀表达式的值可以使用堆栈。

算法
  1. 创建一个空堆栈。
  2. 遍历后缀表达式的每个字符。
  3. 如果当前字符是操作数,则将其推入堆栈。
  4. 如果当前字符是运算符,则从堆栈中弹出两个操作数,并将它们与当前运算符计算,然后将结果推回堆栈。
  5. 遍历完后缀表达式后,堆栈中剩下的元素就是表达式的结果。
示例
输入:

后缀表达式: "5 1 2 + 4 * + 3 -"

输出:

使用堆栈的过程如下:

| 操作 | 栈的状态 | | -------- | -------- | | | | | | | | (初始化) | | | | | | | | | 5 | 5 | | 1 | 5, 1 | | 2 | 5, 1, 2 | | | 5, 3 | | | 20 | | 4 | 20, 4 | | | 80 | | + | 84 | | 3 | 84, 3 | | | 81 | | - | 81 |

因此,表达式的值为81。

代码

以下是使用C++实现该算法的示例代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
    string str="5 1 2 + 4 * + 3 -";
    stack<int>s;//定义数值堆栈
    for(int i=0;i<str.length();i++){
        if(str[i]==' '||str[i]==',')continue;//排除无用字符
        else if(isdigit(str[i])){//如果遇到数字
            int x=0;
            while(isdigit(str[i])){//处理多位整数
                x=x*10+str[i]-'0';
                i++;
            }
            i--;
            s.push(x);
        }
        else{//如果遇到操作符
            int a,b;
            a=s.top();
            s.pop();
            b=s.top();
            s.pop();
            if(str[i]=='+')s.push(a+b);//加法
            else if(str[i]=='-')s.push(b-a);//减法
            else if(str[i]=='*')s.push(a*b);//乘法
            else s.push(b/a);//除法
        }
    }
    cout<<s.top();//输出结果
    return 0;
}