20. 有效的括号
题目连接
https://leetcode.cn/problems/valid-parentheses/
括号不匹配场景
1.有左括号,无右括号
2.左右括号类型不匹配
3.有右括号,无左括号
解题方法
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();
}
};
1047. 删除字符串中的所有相邻重复项
https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/
解题方法:
class Solution {
public:
string removeDuplicates(string s) {
stack<char> st;
for(char t : s)
{
if(st.empty() || t != st.top())
{
st.push(t);
}
else
{
st.pop();
}
}
string result = "";
while(!st.empty())
{
result += st.top();
st.pop();
}
reverse(result.begin(), result.end());
return result;
}
};
150. 逆波兰表达式求值
https://leetcode.cn/problems/evaluate-reverse-polish-notation/
后缀表达式
(1+2)*(3+4) -> 12+34+*
遇到数字入栈, 遇到操作符出栈两次, 计算之后再入栈
解题方法:
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;
}
};