代码随想录算法训练营第九天|Leetcode 20 有效的括号,Leetcode 1047 删除字符串中的所有相邻重复项,Leetcode 150. 逆波兰表达式求值
Leetcode 20.有效的括号
题目链接 20. 有效的括号
文章链接 https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html
视频链接 https://www.bilibili.com/video/BV1AF411w78g
思路
用栈做方便一些,因为栈方便记录上一个元素,当没遍历到‘}’、‘)‘、’]'时,将对应元素压入栈,遍历到时,判断栈顶元素是否与其相匹配,匹配就弹出栈,不匹配就压入栈,继续判断下一个。结束时,如果栈有元素,就说明有元素没有匹配到,返回false,否则返回true
代码
class Solution {
public:
bool isValid(string s) {
if (s.size() % 2 != 0) return false;
stack<char> sta;
int i=0;
while(s[i]){
//判断条件前提必须栈中有元素
if(sta.size()){
if((s[i]=='}'&&sta.top()=='{')||(s[i]==')'&&sta.top()=='(')||(s[i]==']'&&sta.top()=='[')){
sta.pop();
i++;
continue;
}
}
sta.push(s[i]);
i++;
}
if(!sta.size()){
return true;
}
return false;
}
};
Leetcode 1047.删除字符串中的所有相邻重复项
题目链接 1047. 删除字符串中的所有相邻重复项
文章链接 https://programmercarl.com/1047.%E5%88%A0%E9%99%A4%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E7%9B%B8%E9%82%BB%E9%87%8D%E5%A4%8D%E9%A1%B9.html
视频链接 https://www.bilibili.com/video/BV12a411P7mw
思路
这道题和上道题很相似,只不过变成要输出不匹配的的元素,依然用栈来做。判断每次要压入栈的元素是否和上一个元素匹配,匹配就把上一个元素弹出,不匹配就把当前元素压入,等待下一个元素的匹配情况。注意输出的结果是倒序的,还要做一次反转,或者刚开始就反转再压入
代码
class Solution {
public:
string removeDuplicates(string s) {
stack<char> st;
int cnt=0;
int i=0;
reverse(s.begin(),s.end());
while(s[i]){
if(!st.empty()&&s[i]==st.top()){
//cout<<st.top();
st.pop();
cnt--;
i++;
continue;
}
st.push(s[i]);
cnt++;
//cout<<st.top();
i++;
}
string res;
res.resize(cnt);
int j=0;
while(!st.empty()){
//cout<<st.top();
res[j++] = st.top();
//cout<<res[j];
st.pop();
}
return res;
}
};
Leetcode 150. 逆波兰表达式求值
题目链接 150. 逆波兰表达式求值
文章链接 https://programmercarl.com/0150.%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC.html
视频链接 https://www.bilibili.com/video/BV1kd4y1o7on
思路
这道题就是去求后缀表达式,经典用栈解决的一道题。把数字压入,遇到运算符就弹出栈顶前两位,把每次计算的结果再压入栈,这道题注意要把字符串转换成数字压入或者计算
代码
class Solution {
public:
int evalRPN(vector<string>& tokens) {
int temp;
stack<string> st;
int result=0;
//如果不是运算符则压入
for(auto it=tokens.begin();it!=tokens.end();it++){
if((*it!="/")&&(*it!="+")&&(*it!="-")&&(*it!="*")){
st.push(*it);
//是运算符就判断运算符类型
}else{
temp=stoi(st.top(),0,10);
st.pop();
result=stoi(st.top(),0,10);
if(*it=="+"){
result+=temp;
}else if(*it=="-"){
result-=temp;
}else if(*it=="*"){
result*=temp;
//cout<<result<<endl;
}else{
result/=temp;
}
st.pop();
st.push(to_string(result));
}
}
//结果要取此时的栈顶元素,否则会少输入只有一个字符串的情况
result = stoi(st.top(),0,10);
return result;
}
};