代码随想录算法训练营第十一天 | 20.有效的括号 1047. 删除字符串中的所有相邻重复项 150.逆波兰表达式求值
有效的括号
思路:
括号匹配是使用栈解决的经典问题。
首先判断字符串是否为奇数,奇数返回false。
声明栈st,遍历字符串,若遇到左括号则将右括号push入栈。若遇到右括号,则看他是否与st.top相同,若不相同则返回false,否则将st.top pop,遍历结束返回st.empty();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Solution { public: bool isValid(string s) { if (s.size() % 2 != 0) return false; stack<char> st; for (int i = 0; i < s.size(); i++) { if (s[i] == '(') st.push(')'); else if (s[i] == '{') st.push('}'); else if (s[i] == '[') st.push(']'); else if (st.empty() || st.top() != s[i]) return false; else st.pop(); } return st.empty(); } };
|
删除字符串中的所有相邻重复项
思路:
将字符串push入栈中,如果遇到相同的则pop()。最后将栈中元素加入字符串中,最后将字符串反转。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public: string removeDuplicates(string S) { stack<char> st; for (char s : S) { if (st.empty() || s != st.top()) { st.push(s); } else { st.pop(); } } string result = ""; while (!st.empty()) { result += st.top(); st.pop(); } reverse (result.begin(), result.end()); return result;
} };
|
逆波兰式求值
思路:
将字符串压入栈中,若遇到运算符号则进行运算,注意num2,nums1的运算顺序以及将字符串用stoll转换为长字符
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
| class Solution { public: int evalRPN(vector<string>& tokens) { stack<long long> st; for (int i = 0; i < tokens.size(); i++) { if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") { long long num1 = st.top(); st.pop(); long long num2 = st.top(); st.pop(); if (tokens[i] == "+") st.push(num2 + num1); if (tokens[i] == "-") st.push(num2 - num1); if (tokens[i] == "*") st.push(num2 * num1); if (tokens[i] == "/") st.push(num2 / num1); } else { st.push(stoll(tokens[i])); } }
int result = st.top(); st.pop(); return result; } };
|