20. 有效的括号
思路就是,当遍历到一个左括号的时候,栈中压入一个右括号
遍历到右括号时,栈弹出,如果栈不能弹出对应的括号就返回false
bool isValid(string s) {
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() ? true : false;
}
1047. 删除字符串中的所有相邻重复项
用类似数组的解法比较清晰,符合条件的果子摘到result数组中
栈的思路是把符合条件的压栈再反转
string removeDuplicates(string s) {
string ans;
for (char c : s) {
if (ans.size() && ans.back() == c)
ans.pop_back();
else
ans += c;
}
return ans;
// stack<char> st;
// for(int i = 0; i < s.size(); ++i)
// {
// if(!st.empty() && s[i] == st.top())
// {
// st.pop();
// // cout<<i<<" "<<s[i]<<endl;
// }
// else
// st.push(s[i]);
// }
// string result;
// while(!st.empty())
// {
// char ch = st.top();
// st.pop();
// result += ch;
// // cout<<result<<endl;
// }
// reverse(result.begin(), result.end());
// return result;
}
150. 逆波兰表达式求值
实际上就是把后缀表达式读取出来并计算
后缀表达式就是按顺序读取两个数字配一个运算符进行计算
int evalRPN(vector<string>& tokens) {
int result = 0;
int num1, num2;
stack<long long> st;
for(int i = 0; i < tokens.size(); ++i)
{
if(tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/")
{
num2 = st.top();
st.pop();
num1 = st.top();
st.pop();
if(tokens[i] == "+") st.push(num1 + num2);
if(tokens[i] == "-") st.push(num1 - num2);
if(tokens[i] == "*") st.push(num1 * num2);
if(tokens[i] == "/") st.push(num1 / num2);
}
else
{
st.push(stoll(tokens[i]));
}
}
return st.top();
}