本篇记录关于栈的经典问题。
括号匹配问题
这也是一个经典的问题,一句话就是判断字符串中圆括号、中括号、花括号是否成对出现。
算法基本思想:
第一步:遇到{,[,(,将它压入栈中。
第二步:遇到},},),将其与栈中元素比较,看是否成对出现。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| #include <iostream> #include <string> #include <stack> using namespace std; bool isValidParentheses(string str) { stack<char> st; char temp; for (int i = 0; i < str.length(); i++) { if(!st.empty()) temp=st.top(); if(str[i]=='{'||str[i]=='('||str[i]=='[') st.push(str[i]); else if(str[i]=='}') { if(temp=='{'&&(!st.empty())) st.pop(); else return false; } else if(str[i]==']') { if(temp=='['&&(!st.empty())) { st.pop(); } else return false; } else if(str[i]==')') { if(temp=='('&&(!st.empty())) st.pop(); else return false; } } if(st.empty()) return true; else return false; } int main() { string str="45)[s5s]{}"; cout<<isValidParentheses(str)<<endl; return 0; }
|
求解后缀表达式
一般指的是中缀表达式转成后缀表达式,因为后缀表达式可以利用栈来进行四则运算。具体的思想可以参考利用栈将中缀表达式转换成后缀表达式,这里贴出具体的代码实现 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
| vector<string> InfixToPostfix(vector<string> infix) { vector<string> postfix; stack<string> mark; map<string,int> priority; priority["+"] = 0; priority["-"] = 0; priority["*"] = 1; priority["/"] = 1; priority["("] = 2; priority[")"] = -1; string current; string top; for (int i = 0; i < infix.size(); i++) { current=infix[i]; if(current=="+"||current=="-"||current=="*"||current=="/"||current=="(") { if(mark.empty()) { mark.push(current); } else { while(!mark.empty()) { top=mark.top(); if(priority[top]>=priority[current]) { if(top=="(") { mark.push(current); break; } else { postfix.push_back(top); mark.pop(); } } else { mark.push(current); break; } } if(mark.empty()) { mark.push(current); } } } else if(current==")") { while(!mark.empty()) { top=mark.top(); if(top!="(") { postfix.push_back(top); mark.pop(); } else { mark.pop(); break; } } } else { postfix.push_back(current); } } while(!mark.empty()) { top=mark.top(); postfix.push_back(top); mark.pop(); } return postfix; }
|