class Solution {
public:
bool isValid(string s) {
stack<char> stk;
int size = s.size();
for(int i = 0;i<size;i++){
if(s[i]=='('||s[i]=='{'||s[i]=='['){
stk.push(s[i]);
}
if(s[i]==')'){
if(stk.top()=='('){
stk.pop();
}else{
return false;
}
}
else if(s[i]=='}'){
if(stk.top()=='{'){
stk.pop();
}else{
return false;
}
}
else if(s[i]==']'){
if(stk.top()=='['){
stk.pop();
}else{
return false;
}
}
}
return stk.empty();
}
};
简单的括号匹配;
class Solution {
public:
string removeDuplicates(string s) {
stack<char> stk;
int size = s.size();
for(int i = 0;i<size;i++){
if(stk.empty()||s[i]!=stk.top()){
stk.push(s[i]);
}
else{
stk.pop();
}
}
string result = "";
while(!stk.empty()){
result += stk.top();
stk.pop();
}
reverse(result.begin(),result.end());
return result;
}
};
思路:用栈来进行记录,遇到栈为空或者和栈顶元素不同时进栈,否则出栈,最后全部出栈并且反转;
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<long long> stk;
int s = tokens.size();
for(int i = 0;i<s;i++){
long long num1 = 0;
long long num2 = 0;
if(tokens[i]!="+"&&tokens[i]!="-"&&tokens[i]!="*"&&tokens[i]!="/"){
stk.push(stoll(tokens[i]));
}else if(!stk.empty()&&tokens[i]=="+"){
num1 = stk.top();
stk.pop();
num2 = stk.top();
stk.pop();
stk.push(num1 + num2);
}else if(!stk.empty()&&tokens[i]=="-"){
num1 = stk.top();
stk.pop();
num2 = stk.top();
stk.pop();
stk.push(num2 - num1);
}else if(!stk.empty()&&tokens[i]=="*"){
num1 = stk.top();
stk.pop();
num2 = stk.top();
stk.pop();
stk.push(num1 * num2);
}else if(!stk.empty()&&tokens[i]=="/"){
num1 = stk.top();
stk.pop();
num2 = stk.top();
stk.pop();
stk.push(num2 / num1);
}
}
long long result = stk.top();
stk.pop();
return result;
}
};
思路为遇到数字入栈,遇到运算符,从栈中弹出两个数进行计算,把结果再压入栈内·,最后栈内剩余最后一个数即为左后的结果。