代码随想录算法训练营第十一天
20. 有效的括号
题目链接:20. 有效的括号
因为字符串中只有括号,所以如果字符串的size是奇数,一定返回false。将3种左括号压入栈内,遇到3右括号就判断是否和栈顶的符合匹配。如果栈是空的遇到右括号就返回false。循环结束如果栈空了证明都匹配上了,返回true。
class Solution {
public:
bool isValid(string s) {
if(s.size()%2 ==1)return false;
stack<char> st;
for (int i =0;i<s.size();i++){
if(s[i] == '(' || s[i] == '[' || s[i] == '{'){
st.push(s[i]);
}
if (st.empty())return false;
if(s[i] == ')' || s[i] == ']' || s[i] == '}'){
if(s[i]==st.top()+1||s[i]==st.top()+2){
st.pop();
}else return false;
}
}
if (st.empty())return true;
return false;
}
};
1047. 删除字符串中的所有相邻重复项
题目链接:1047. 删除字符串中的所有相邻重复项
把字符串当做一个栈,遍历的时候如果栈空或者字符串元素和栈顶不同就入栈,否则就出栈。
class Solution {
public:
string removeDuplicates(string s) {
string result;
for(int i =0;i<s.size();i++){
if(result.empty()||s[i]!=result.back()){
result.push_back(s[i]);
}else {
result.pop_back();
}
}
return result;
}
};
150. 逆波兰表达式求值
题目链接:150. 逆波兰表达式求值
使用栈,判断字符如果是数字就转成int或者long入栈,如果是运算符就将栈顶的两个数字出栈进行计算,再把结果入栈,最后查看栈顶的结果。注意string字符不能运算,得转换。注意"-“、”/"有
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<long long> result;
for(auto i:tokens){
if (i!="+"&&i!="-"&&i!="*"&&i!="/"){
result.push(atoi(i.c_str()));
//cout<<"n:"<<atoi(i.c_str())<<endl;
}else{
long long a= result.top();
result.pop();
long long b = result.top();
result.pop();
if(i == "+"){result.push(b+a);}
if(i == "-"){result.push(b-a);}
if(i == "*"){result.push(b*a);}
if(i == "/"){result.push(b/a);}
//cout<<"sum:"<<result.top()<<endl;
}
}
return result.top();
}
};