代码随想录第十一天|Leetcode20. 有效的括号、Leetcode1047. 删除字符串中的所有相邻重复项、Leetcode150. 逆波兰表达式求值
Leetcode20. 有效的括号
题目链接:Leetcode20. 有效的括号
注意
- 当stack为空时,不能调用top
class Solution {
public:
bool isValid(string s) {
if(s.size()%2==1) return false;
stack<int> st;
for(int i=0;i<s.size();i++){
if(s[i]=='(' || s[i]=='[' || s[i]=='{') st.push(s[i]);
else if((s[i]==')'||s[i]==']'||s[i]=='}')&&st.empty()) return false;
else 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;
}
return st.empty();
}
};
Leetcode1047. 删除字符串中的所有相邻重复项
自己想的就是两个栈来回倒
class Solution {
public:
string removeDuplicates(string s) {
if(s.size()==0||s.size()==1) return s;
stack<int> StIn;
stack<int> StOut;
for(int i=0;i<s.size();i++){//判断重复
if(StIn.empty() || s[i]!=StIn.top()) StIn.push(s[i]);
else StIn.pop();
}
while(!StIn.empty()){//倒序
StOut.push(StIn.top());
StIn.pop();
}
string result;
while(!StOut.empty()){//放入result
result+=StOut.top();
StOut.pop();
}
return result;
}
};
注意
vector和string可以使用STL库中的reverse函数,用法为reverse(str.begin(),str.end())
就可以实现从begin到end的翻转
Leetcode150. 逆波兰表达式求值
注意
- 对于string,有stoi()、stol()、stoll()函数,分别可以将括号内的字符串转换为int、long、long long整形
这道题就长着“我要用栈解决”的模样,没啥好说的,直接拿下
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 temp1=st.top();
st.pop();
long long temp2=st.top();
st.pop();
if(tokens[i]=="+") st.push(temp1+temp2);
if(tokens[i]=="-") st.push(temp2-temp1);
if(tokens[i]=="*") st.push(temp1*temp2);
if(tokens[i]=="/") st.push(temp2/temp1);
}
else {
st.push(stoll(tokens[i]));//把数字塞进去
}
}
int result=st.top();
st.pop();
return result;
}
};