代码随想录刷题随记10-栈和队列的应用
20. 有效的括号
leetcode链接
有三种不匹配的情况,
第一种情况,字符串里左方向的括号多余了 ,所以不匹配 : 对应遍历完栈不为空的情况。
第二种情况,括号没有多余,但是 括号的类型没有匹配上。:对应于出栈的符号和所需符号不符合。
第三种情况,字符串里右方向的括号多余了,所以不匹配。对应于需要出栈但是栈空了。
class Solution {
public:
bool isValid(string s) {
stack<char> mystack;
for(char ch :s ){
if(ch=='('||ch=='{'||ch=='['){
mystack.push(ch);
continue;
}
else{
char tmp;
switch(ch){
case ')':
if(mystack.empty()){
return false;
}
tmp=mystack.top();
mystack.pop();
if(tmp!='(')
return false;
break;
case '}':
if(mystack.empty()){
return false;
}
tmp=mystack.top();
mystack.pop();
if(tmp!='{')
return false;
break;
case ']':
if(mystack.empty()){
return false;
}
tmp=mystack.top();
mystack.pop();
if(tmp!='[')
return false;
break;
}
}
}
if(!mystack.empty()){
return false;
}
return true;
}
};
1047. 删除字符串中的所有相邻重复项
leetcode链接
注意这道题只是两两删除相邻的。如果是有奇数个相同的不会全部删除,只是简单的配对删除,所以要注意程序中while部分被注释了。如果是重复的全删除不用注释那一句。
class Solution {
public:
string removeDuplicates(string s) {
if(s.size()<2){
return s;
}
stack<char> mystack;
mystack.push(s[0]);
for(int i=1;i<s.size();){
if(!mystack.empty()&&mystack.top()==s[i]){
//while(mystack.top()==s[i]&&i<s.size()) i++;
i++;
mystack.pop();
}
else{
mystack.push(s[i]);
i++;
}
}
string ret="";
while(!mystack.empty()){
ret.insert(ret.begin(), mystack.top());
mystack.pop();
}
//reverse(ret.begin(),ret.end());
return ret;
}
};
150. 逆波兰表达式求值
逆波兰表达式:是一种后缀表达式,所谓后缀就是指运算符写在后面。
平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。
该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。
用栈求解和之前对消的题目比较相似,只是需要在消除前做运算
注意 : 减法和除法的减数与被减数的顺序需要注意,因为栈出来的顺序是反的。
解题代码:
class Solution {
public:
int evalRPN(vector<string>& tokens) {
if(tokens.size()==1){
return stoi(tokens[0]);
}
stack<long long> mystack;
long long ret=0;
for(int i=0;i<tokens.size();i++){
if(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="/"||tokens[i]=="*"){
long num1=mystack.top();
mystack.pop();
long num2=mystack.top();
mystack.pop();
if(tokens[i]=="+"){
ret=num1+num2;
mystack.push(ret);
}
else if(tokens[i]=="-"){
ret=num2-num1;
mystack.push(ret);
}
else if(tokens[i]=="*"){
ret=num1*num2;
mystack.push(ret);
}
else{
ret=num2/num1;
mystack.push(ret);
}
}
else{
mystack.push(stoll(tokens[i]));
}
}
return (int)ret;
}
};