栈的应用-四则运算表达式求值

栈的应用-四则运算表达式求值

1. 后缀(逆波兰)表示法

我们平时写的数学计算表达式是中缀表达式,表示左操作数+操作符+右操作数,形如a + b * c的就叫做中缀表达式。

但是计算机对于计算中缀表达式却有困难,计算机先依次将 a+b 放入栈中,这个时候应该计算吗?如果计算了,很明显答案是错误的,因为后面还有乘法*, 乘法的优先级是要比加法高的。如果碰到有括号的表达式,如(a + b) * (c - d) , 就更为复杂了。

对此,一种不需要括号,适应栈结构的表达式后缀表达式可以解决计算机计算的困难。

中缀表达式后缀表达式
a + b + cab+c+
a + b * cabc*+

后缀表达式的表示方法:运算数顺序不变,运算符按优先级进行排布

2. 后缀(逆波兰)表达式计算

【题目链接】:LCR 036. 逆波兰表达式求值

思路:要用到一个栈空间,用于存放运算数

在这里插入图片描述

代码实现:

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
      stack<int> st;
      for (auto &e : tokens)
      {
        if (e == "+" || e == "-" || e == "*" || e == "/")
        {
          // 如果e是操作符,出两次栈,进行计算
          int b = st.top();
          st.pop();
          int a = st.top();
          st.pop();
          switch(e[0])
          {
            case '+':
              st.push(a + b); break;
            case '-':
              st.push(a - b); break;
            case '*':
              st.push(a * b); break;
            case '/':
              st.push(a / b); break;
          }
        }
        else 
        {
          // 如果e是操作数,入栈
          st.push(std::stoi(e.c_str()));
        }
      }
      return st.top();
    }
};

3. 中缀表达式转换成后缀表达式

后缀表达式与中缀表达式的区别就是运算符的位置,转换需要调整运算符优先级

思路:

在这里插入图片描述


例如:a + b * (c - d / e) + f

重点是若字符是操作符或者括号时候的处理

  • 操作数a直接输出。接着+,此时栈空,+入栈。

在这里插入图片描述

  • 操作数b直接输出。接着*, *优先级比+要高,*入栈。

在这里插入图片描述

  • 左括号递归进行转换后缀表达式,建立一个新的栈空间。栈空,-入栈

在这里插入图片描述

  • 操作数d直接输出。/优先级比-高,入栈。

在这里插入图片描述

  • 操作数e直接输出。遇到),将栈内所有运算符依次出栈,得到结果

在这里插入图片描述

  • 该结果接到递归的上一层结果后

在这里插入图片描述

  • +号比栈顶元素*优先级低,*出栈输出。+继续与栈顶元素+进行比较,相等仍然需要栈顶元素出栈输出。

在这里插入图片描述

  • 操作数f直接输出。遍历到中缀表达式结尾,栈内元素依次出栈输出。

在这里插入图片描述

最后得到结果:a + b * (c - d / e) + f–>a b c d e / - * f +


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值