Leetcode 20. 有效的括号
思路分析:
本题可以巧妙地使用stack先进后出的特征,遍历到’(‘, ‘[’, ‘{‘时就在tmp_stack中压入能组成组合的’)’,’]‘,’}'.继续遍历时可以核对s[i]和tmp_stack.top()是否相等,如果不等或tmp_stack为空,则返回false。否则压出tmp的top元素。最后根据tmp是否为空,决定结果。
代码实现:
class Solution {
public:
bool isValid(string s) {
stack<char> tmp_stack;
for (int i=0; i < s.size(); i++) {
if (s[i]=='(') tmp_stack.push(')');
else if (s[i]=='[') tmp_stack.push(']');
else if (s[i]=='{') tmp_stack.push('}');
else if (tmp_stack.empty() || s[i]!=tmp_stack.top()) return false;
else tmp_stack.pop();
}
return tmp_stack.empty();
}
};
Leetcode 1047. 删除字符串中的所有相邻重复项
思路分析:
重复项删除操作会选择两个相邻且相同的字母,并删除它们。就需要判断当前元素和已经存储的元素是否相同,如果不相同,则把s[i]插入result中。如果相同,则删除已经保存的底部元素。
代码实现:
class Solution {
public:
string removeDuplicates(string S) {
string result;
for(char s : S) {
if(result.empty() || result.back() != s) {
result.push_back(s);
}
else {
result.pop_back();
}
}
return result;
}
};
Leetcode 150. 逆波兰表达式求值
思路分析:
使用一个栈来模拟计算过程。遍历tokens数组,如果遇到运算符,则从栈中弹出两个操作数进行运算,并将结果压入栈中;如果遇到数字,则将数字转换为整数并压入栈中。最后,栈中剩余的元素就是表达式的计算结果。
代码实现:
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<long long> st;
for (auto tok : tokens) {
if (tok == "+" || tok == "-" || tok == "*" || tok == "/") {
long long b = st.top();
st.pop();
long long a = st.top();
st.pop();
int result;
if (tok == "+") {
result = a+b;
} else if (tok == "-") {
result = a - b;
} else if (tok == "*") {
result = a * b;
} else if (tok == "/") {
result = a / b;
}
st.push(result);
} else {
st.push(stoi(tok));
}
}
return st.top();
}
};