c++實現將表達式轉換為逆波蘭表達式


https://github.com/Lanying0/lintcode

所屬:

數據結構->線性結構->棧

問題:

給定一個表達式字符串數組,返回該表達式的逆波蘭表達式(即去掉括號)。

樣例
對於 [3 - 4 + 5]的表達式(該表達式可表示為["3", "-", "4", "+", "5"]),返回 [3 4 - 5 +](該表達式可表示為 ["3", "4", "-", "5", "+"])。

 思路:

逆波蘭的一般思路,對於輸入的字符串,構建兩個棧,一個棧中暫存運算符號,另一個棧中存表達式結果。

從頭到尾一遍掃描字符串:遇到運算數,則直接壓入表達式結果棧;遇到運算符,則要根據運算符優先級分情況處理。

運算符情況:1.左括號:直接壓入符號棧。

                 2.加號、減號,優先級最低,所以要將棧中的加減乘除號先出棧到表達式結果棧,再將加減號入棧。

      3.乘號、除號,優先級最高,所以只需將棧中的乘除號出棧到表達式結果棧,再將此次的乘除號入棧。

      4.右括號:將棧中左括號之后入棧的運算符全部出棧到表達式結果棧,左括號出棧。

一遍掃描后,若符號棧不為空,則將其全部出棧到表達式結果棧。即為所求。

代碼:

class Solution {
public:
    /**
     * @param expression: A string array
     * @return: The Reverse Polish notation of this expression
     */
    vector<string> convertToRPN(vector<string> &expression) {
        // write your code here
        vector<string>op;//符號棧
        vector<string>num;//表達式結果棧
        for(int i=0;i<expression.size();i++)//一遍掃描
        {
            if(expression[i]=="+" || expression[i]=="-")//處理加號、減號
            {
                if(op.size()==0)
                    op.push_back(expression[i]);
                else
                {
                while(op.size()!=0 && (op[op.size()-1]=="*" || op[op.size()-1]=="/" ||op[op.size()-1]=="+" || op[op.size()-1]=="-"))
                {
                    string s=op.back();
                    op.pop_back();
                    num.push_back(s);
                   
                } op.push_back(expression[i]);
                }
                if(op[op.size()-1]=="(")
                {
                    op.push_back(expression[i]);
                }
            }
            else if(expression[i]=="*" || expression[i]=="/")//處理乘號、除號
            {
                 if(op.size()==0)
                    op.push_back(expression[i]);
                else if(op[op.size()-1]=="*" || op[op.size()-1]=="/" )
                {
                    string s=op.back();
                    op.pop_back();
                    num.push_back(s);
                    op.push_back(expression[i]);
                }
                 else if(op[op.size()-1]=="+" || op[op.size()-1]=="-")
                {
                    op.push_back(expression[i]);
                }
                 else if(op[op.size()-1]=="(")
                {
                    op.push_back(expression[i]);
                }
            }
            else if(expression[i]=="(")//處理左括號
            {
                    op.push_back(expression[i]);
            }
            else if(expression[i]==")")//處理右括號
            {
                while(op.back()!="(")
                { 
                    string s=op.back();
                    op.pop_back();
                    num.push_back(s);
                 }
                 op.pop_back();
            }
            else//運算數直接壓入表達式結果棧
            {
                num.push_back(expression[i]);
            }
        }
        while(op.size()!=0)//符號棧仍有符號時,將其壓入表達式結果棧
        {
            string s=op.back();
            op.pop_back();
            num.push_back(s);
        }
        return num;
    }
};

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM