后缀表达式

1、栈

栈是一种只允许一端操作的线性数据结构,具有LIFO(last in first out)的特点,具有广泛的应用。现在打算用栈结构来实现后缀表达式的计算。

2、后缀表达式

后缀表达式,指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则)。

例如 5+(2+3)*4 转换为后缀表达式为 523+4*+

3、后缀表达式的计算

规则:从左向右扫描,遇到数字压栈,遇到操作符,弹出栈顶的两个元素,先弹出的元素在右边,后弹出来的在左边,进行计算后,将结果压栈,再往后扫描,直到扫描结束,输出栈顶元素,即为最终结果。
523+4*+为例
5压栈 2压栈 3压栈 遇到+号,弹出3 2,计算2+3,将5压栈,此时栈为5 5,将4压栈,遇到*号,弹出4 5,计算5*4,将20压栈 此时栈为5 20 ,遇到+号,计算5+20,将25压栈,扫描结束,输出25。
以上就是计算过程。下面用C++编写代码,为了方便标记算式的结束,在末尾我们加上#,用来标识算式结束,这里我们只进行四则运算

#include <iostream>
#include <stack>
#include "string"
using namespace std;
int main()
{
    stack<int> a;
    string temp;
    cin >> temp;
    int i = 0;
    while (true)
    {
        if (temp[i]=='#') cout << a.top(); break;
        if (temp[i]<='9'&&temp[i]>='0') a.push(temp[i]-48);
        else
        {
            int x, y;
            y = a.top(); a.pop();
            x = a.top(); a.pop();
            switch (temp[i])
            {
            case '+':a.push(x + y); break;
            case '-':a.push(x - y); break;
            case '*':a.push(x * y); break;
            case '/':a.push(x / y); break;
            default:break;
            }
        }
        ++i;        
    }
    cin >> temp;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/wayway0554/article/details/79892489