代码随想录打卡day11
栈与队列2
1.20有效的括号
一个问题卡了很久,空栈判断要在前!!否则可能会操作空栈报错,即case2放case1前就没事
class Solution {
public:
bool isValid(string s) {
stack<char> mySymbol;
if(s.size()%2){//为奇数则直接剪枝
return false;
}
//true 遍历完而且栈空
//case1 遍历时遇到不匹配的
//case2 遍历未结束栈先空;右边多
//case3 遍历结束栈未空;左边多
for(char c : s){
if(c == '('){
mySymbol.push(')');}
else if(c == '['){
mySymbol.push(']');}
else if(c == '{'){
mySymbol.push('}');}
else if(mySymbol.empty()){//case2
return false;
}
else if(c != mySymbol.top()){//case1
return false;
}
else{
mySymbol.pop();
}
}
return mySymbol.empty();//case3
}
};
2.1047删除字符串中的所有相邻重复项
class Solution {
public:
string removeDuplicates(string s) {
stack<char> st;
string result;
for(char c : s){
if( !st.empty() && st.top() == c){
st.pop();
}else{
st.push(c);
}
}
while(!st.empty()){
result += st.top();
st.pop();
}
reverse(result.begin(),result.end());
return result;
}
};
3.150逆波兰表达式求值
判断一个字符是不是数字
最好是把结果和过程数 abc这三个数都取long类型,以免运算中途超过int范围。
#include <cctype>
isdigit(s)
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> st;
int a,b,c;
for(string s : tokens){
if(s == "+" || s == "-" || s == "*" || s == "/"){//是运算符
b = st.top();
st.pop();
a = st.top();
st.pop();
if(s == "+"){c = a + b;}
else if(s == "-"){c = a - b;}
else if(s == "*"){c = a * b;}
else {c = a / b;}
st.push(c);
}
else{//是数字
st.push(stoi(s));
}
}
c = st.top();
st.pop();
return c;
}
};