栈与队列part02
1.有效的括号
题目https://leetcode.cn/problems/valid-parentheses/
class Solution {
public:
bool isValid(string s) {
stack<char> st;//stack<int>时存入栈的是字母的acsii码
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();//st.top()=s[i],说明左右符号配对,栈弹出元素,继续遍历
}
return st.empty();//若字符串遍历完了,栈里面还有,说明左符号多余(字符串里多少左符号->栈大小)
//若匹配成功,应为空栈,return 0
}
};
盲点:
1.匹配成功
需要先左后右且左右要匹配
2.不匹配分类三种
a.字符串里左方向的括号多余了
https://code-thinking-1253855093.file.myqcloud.com/pics/2020080915505387.png
b.括号没有多余,但是 括号的类型没有匹配上
https://code-thinking-1253855093.file.myqcloud.com/pics/20200809155107397.png
c.字符串里右方向的括号多余了
https://code-thinking-1253855093.file.myqcloud.com/pics/20200809155115779.png
3.栈的大小
栈用来存字符串遍历到左符号对应的右符号,所以栈的大小由字符串里有多少左符号决定
2.删除字符串中的所有相邻重复项
题目https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/
题解
class Solution {
public:
string removeDuplicates(string S) {
string result;
for(char s:S){
if(result.empty()||result.back()!=s){//result里没有当前遍历到的元素
result.push_back(s);//放入result
}
else{//result里有当前遍历到的元素
result.pop_back();//弹出该元素,即消除两个一样的
}
}
return result;
}
};
盲点:
1.为什么用字符串存储
字符串是正序的,将其输入栈再从栈中弹出剩余元素,是倒序的,需要再对字符串进行反转一下;
所以可以拿字符串直接作为栈
3. 逆波兰表达式求值
题目https://leetcode.cn/problems/evaluate-reverse-polish-notation/
题解
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(num1+num2);
if(tokens[i]=="-") st.push(num2-num1);//num1num2顺序??
if(tokens[i]=="*") st.push(num1*num2);
if(tokens[i]=="/") st.push(num2/num1);
}
else{//遇到数字就push进栈里
st.push(stoll(tokens[i]));
}
}
int result=st.top();//最后栈里留下数字为表达式结果
st.pop();
return result;
}
};
盲点:
1.//num1num2顺序??
if(tokens[i]=="+") st.push(num1+num2);
if(tokens[i]=="-") st.push(num2-num1);//num1num2顺序??