目录
1简介
没什么好说的,主要是利用栈的思路来解决题目。不一定要用stl提供的stack,有时候自己用个数组或string来模拟,也是很方便的。
2.例题
2.1删除字符串中的所有相邻重复项
1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)
class Solution { public: string removeDuplicates(string s) { string ans=""; int size=0; int index=0; int n=s.size(); while(index<n) { if(size==0||ans[size-1]!=s[index]) { ans+=s[index]; size++; } else { ans.pop_back(); size--; } index++; } return ans; } };
2.2比较含退格的字符串
思路依旧是利用栈,没有太多别的内容
class Solution { public: bool backspaceCompare(string s, string t) { string a1,a2; int n1=s.size(),n2=t.size(); int s1=0,t1=0; int is=0,it=0; while(is<n1) { if(s[is]=='#') { if(s1!=0)a1.pop_back(),s1--; } else { s1++; a1+=s[is]; } is++; } while(it<n2) { if(t[it]=='#') { if(t1!=0)a2.pop_back(),t1--; } else { t1++; a2+=t[it]; } it++; } if(a1!=a2)return false; return true; } };
2.3基本计算器2
class Solution { public: int calculate(string s) { stack<int> mp; char op = '+'; int tmp = 0; for (auto a : s) { if (a >= '0' && a <= '9') { tmp *= 10; tmp += (a - '0'); } else if (a == '+' || a == '-' || a == '*' || a == '/') { if (op == '+') { mp.push(tmp); tmp = 0; } else if (op == '-') { mp.push(-tmp); tmp = 0; } else if (op == '*') { int x = mp.top(); mp.pop(); mp.push(x * tmp); tmp = 0; } else if (op == '/') { int x = mp.top(); mp.pop(); if (tmp != 0) mp.push(x / tmp); tmp = 0; } op = a; } } if (op == '+') { mp.push(tmp); tmp = 0; } else if (op == '-') { mp.push(-tmp); tmp = 0; } else if (op == '*') { int x = mp.top(); mp.pop(); mp.push(x * tmp); tmp = 0; } else if (op == '/') { int x = mp.top(); mp.pop(); if (tmp != 0) mp.push(x / tmp); tmp = 0; } int ans = 0; while (!mp.empty()) { ans += mp.top(); mp.pop(); } return ans; } };
2.4字符串解码
思路很清晰,就是用栈模拟。
class Solution { public: string decodeString(string s) { stack<string> a; a.push(""); stack<int> b; int n = s.size(); int i = 0; while (i < n) { if (s[i] >= '0' && s[i] <= '9') { int x = s[i] - '0'; i++; while (i < n && s[i] >= '0' && s[i] <= '9') { x = x * 10 + (s[i] - '0'); i++; } b.push(x); } else if (s[i] == '[') { i++; string tmp = ""; while (i < n && s[i] >= 'a' && s[i] <= 'z') { tmp += s[i]; i++; } a.push(tmp); } else if (s[i] == ']') { string x = a.top(); a.pop(); int z = b.top(); b.pop(); string tmp = ""; for (int j = 0; j < z; j++) { tmp += x; } i++; a.top() += tmp; } else if (s[i] >= 'a' && s[i] <= 'z') { string tmp = ""; while (i < n && s[i] >= 'a' && s[i] <= 'z') { tmp += s[i]; i++; } a.top() += tmp; } } return a.top(); } };
2.5验证栈序列
思路就是模拟栈的Push和Pop。不符合直接false即可
class Solution { public: bool validateStackSequences(vector<int>& pushed, vector<int>& popped) { int shi=0,opi=0; stack<int>mp; int n=pushed.size(),m=popped.size(); while(shi<n&&opi<m) { mp.push(pushed[shi++]); while (opi < m &&!mp.empty() && popped[opi] == mp.top()) { mp.pop(); opi++; } } if(opi==m)return true; return false; } };