20. 有效的括号(比较简单,主要是利用栈的特点)
class Solution {
public:
bool isValid(string s) {
stack<char> arr;
for(int i = 0; i<s.length(); i++)
{
char temp = s[i];
switch(temp)
{
case '(':
{
arr.push(temp);
continue;
}
case '[':
{
arr.push(temp);
continue;
}
case '{':
{
arr.push(temp);
continue;
}
case ')':
{
if(arr.empty()==false&&arr.top()=='(')
{
arr.pop();
continue;
}
else
{
return false;
}
}
case ']':
{
if(arr.empty()==false&&arr.top()=='[')
{
arr.pop();
continue;
}
else
{
return false;
}
}
case '}':
{
if(arr.empty()==false&&arr.top()=='{')
{
arr.pop();
continue;
}
else
{
return false;
}
}
}
}
if(arr.size()!=0)
{
return false;
}
return true;
}
};
1047. 删除字符串中的所有相邻重复项(和括号类似,相同就弹出栈)
class Solution {
public:
string removeDuplicates(string s) {
stack<char> arr;
for(int i= 0; i< s.length(); i++)
{
char temp = s[i];
if(arr.empty())
{
arr.push(temp);
continue;
}
char top = arr.top();
if(top == s[i])
{
arr.pop();
}
else
{
arr.push(s[i]);
}
}
int len = arr.size();
for(int i = len-1; i >=0; i--)
{
s[i] = arr.top();
arr.pop();
}
return string(s.begin(),s.begin()+len);
}
};
150. 逆波兰表达式求值(算术表达式,和删除相邻的一样,不过是相邻数计算后再重新进栈)
class Solution {
public:
int evalRPN(vector<string>& tokens) {
int len = tokens.size();
stack<int> arr;
for(int i = 0; i < len; i++)
{
string temp = tokens[i];
if(temp == "+")
{
int top = arr.top();
arr.pop();
top = arr.top() + top;
arr.pop();
arr.push(top);
}
else if(temp == "-")
{
int top = arr.top();
arr.pop();
top = arr.top() - top;
arr.pop();
arr.push(top);
}
else if(temp == "*")
{
int top = arr.top();
arr.pop();
top = arr.top() * top;
arr.pop();
arr.push(top);
}
else if(temp == "/")
{
int top = arr.top();
arr.pop();
top = arr.top() / top;
arr.pop();
arr.push(top);
}
else
{
arr.push( stoi( temp ) );
}
}
return arr.top();
}
};