中缀转逆波兰然后计算表达式的值

Posted consolexinhun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了中缀转逆波兰然后计算表达式的值相关的知识,希望对你有一定的参考价值。

中缀转逆波兰

用一个栈装操作符

1、遇到数字就输出
2、遇到操作符,如果栈空直接放入,如果左括号直接放入,如果是右括号,输出并弹出栈顶直到遇到左括号,再把左括号弹出(不用输出),
如果是四则运算符,如果当前比栈顶优先级高,直接放入,否则输出并弹出所有优先级大于等于当前运算符的,再放入当前运算符。
最后将栈里剩下的元素输出弹出

逆波兰求值

每次弹两个,算一下,放回去,最后结果就是栈剩下的最后一个元素

#include<bits/stdc++.h>

using namespace std;


class Solution 
public:
    int f(char c)  // 运算符的优先级
        if(c == \'*\' || c == \'/\') 
            return 2;
        
        else if(c == \'+\' || c == \'-\') 
            return 1;
        
        return -1;
    
    int calculate(string s) 
        int n = s.size();

        string suffix = "";
        stack<char> op;
        for(int i = 0; i < n; i++) 
            if(s[i] == \' \') 
                continue;
            

            if(\'0\' <= s[i] && s[i] <= \'9\') 
                suffix.push_back(s[i]);
            
            
            else  // 四个运算符
                suffix.push_back(\' \');
                if(op.empty()) 
                    op.push(s[i]);
                
                else
                    if(s[i] == \'(\') 
                        op.push(s[i]);
                    
                    else if(s[i] == \')\') 
                        while(op.top() != \'(\') 
                            suffix.push_back(op.top());
                            op.pop();
                        
                        op.pop();
                    
                    else 
                        // 如果当前优先级更高,直接加入栈中
                        if(f(s[i]) > f(op.top())) 
                            op.push(s[i]);
                        
                        else 
                            //弹出,直到栈顶优先级低于当前的优先级,再加入当前的运算符
                            while(!op.empty() && f(op.top()) >= f(s[i])) 
                                suffix.push_back(op.top());
                                op.pop();
                            
                            op.push(s[i]);
                        
                    
                    
                
                
            
        

        suffix.push_back(\' \');
        while(!op.empty()) 
            suffix.push_back(op.top());
            op.pop();
        
        cout<<suffix<<endl;
        return calcSuffix(suffix);
    

    int calcSuffix(string suffix) 
        int n = suffix.size();
        int num = 0; // 临时记录数据

        stack<int> s; // 计算表达式的栈
        bool flag = false;
        
        for(int i = 0; i < n; i++) 
            if(suffix[i] == \' \') 
                cout<<"num="<<num<<endl;
                if(flag) 
                    s.push(num);
                
                num = 0;
                flag = false;
            
            else if(\'0\' <= suffix[i] && suffix[i] <= \'9\') 
                num =  num * 10 + (suffix[i]-\'0\');
                flag = true;
            
            else if(suffix[i] == \'+\' || suffix[i] == \'-\' || suffix[i] == \'*\' || suffix[i] == \'/\')
                int x = s.top(); s.pop();
                int y = s.top(); s.pop();
                if(suffix[i] == \'+\') 
                    s.push(y+x);
                
                else if(suffix[i] == \'-\') 
                    s.push(y-x);
                
                else if(suffix[i] == \'*\') 
                    s.push(y*x);
                
                else 
                    s.push(y/x);
                
            
        
        return s.top();
    
;

int main() 
    Solution s;
    int res = s.calculate("1 + 2  + 3*4 + (5/6) -7");
    cout<<"the answer is "<< res<<endl;
    return 0;

以上是关于中缀转逆波兰然后计算表达式的值的主要内容,如果未能解决你的问题,请参考以下文章

shunting-yard 调度场算法中缀表达式转逆波兰表达式

C语言 逆波兰表达式 算法

中缀表达式转后缀表达式(逆波兰表达式)

表达式求值相关算法

Java数据结构—前缀中缀波兰表达式

栈实现综合计算器(中缀表达式),前缀,中缀,后缀表达式,逆波兰计算器