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; } };