20. 有效的括号
思路:栈的应用,通过先进后出恰巧匹配前后括号,值得注意的是可以将入栈的前括号改写为后括号入栈,后面匹配时就可以直接用是否相等匹配(小技巧,简洁代码)
class Solution {
public:
bool isValid(string s) {
stack<char> st;
for(int i=0; i<s.size(); i++){
if(s[i]=='(' || s[i]=='{' || s[i]=='['){
st.push(s[i]);
}
else if(!st.empty()){
if(s[i]==')' && st.top()=='('){
st.pop();
}
else if(s[i]==']' && st.top()=='['){
st.pop();
}
else if(s[i]=='}' && st.top()=='{'){
st.pop();
}
else{
return false;
}
}
else{
return false;
}
}
if(st.empty()){
return true;
}
else{
return false;
}
}
};
参考文章:代码随想录-20. 有效的括号
1047. 删除字符串中的所有相邻重复项
题目链接:1047. 删除字符串中的所有相邻重复项-力扣(LeetCode)
思路:栈的应用,通过入栈的元素与栈顶元素是否相等来判断重复项,可以不断循环判断新字符串
class Solution {
public:
string removeDuplicates(string s) {
stack<char> st;
for(int i = 0; i<s.size(); i++){
if(st.empty() || s[i]!=st.top()){
st.push(s[i]);
}
else{
st.pop();
}
}
string s1 = "";
while(!st.empty()){
s1 += st.top();
st.pop();
}
reverse (s1.begin(), s1.end());
return s1;
}
};
参考文章:代码随想录-1047. 删除字符串中的所有相邻重复项
150. 逆波兰表达式求值
题目链接:150. 逆波兰表达式求值-力扣(LeetCode)
思路:也是非常经典的算法,将待运算的数值存放在栈中,当遇到运算符,从栈中取出两个数值进行该运算,再将得到的结果存入栈中以便下一次运算
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();
// long long num3 =0;
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);
}
// st.push(num3);
}
else{
st.push(stoll(tokens[i]));
}
}
int result = st.top();
return result;
}
};
参考文章:代码随想录-150. 逆波兰表达式求值