20. 有效的括号
运用栈先进后出的数据性质进行括号的匹配。
class Solution {
public:
bool isValid(string s) {
stack<char> Stack;
if(s.size()%2!=0) return false;
for(int i=0;i<s.size();i++)
{
if(s[i]=='(') Stack.push(')');
else if(s[i]=='[') Stack.push(']');
else if(s[i]=='{') Stack.push('}');
else if(Stack.empty()||s[i]!=Stack.top()) return false;
else Stack.pop();
}
return Stack.empty();
}
};
1047. 删除字符串中的所有相邻重复项
本题也是顺序匹配的问题,好像大部分顺序匹配的问题都可以使用栈或者队列本来就有顺序的数据结构来解决很方便。
class Solution {
public:
string removeDuplicates(string s) {
stack<char> Stack;
for(int i=0;i<s.size();i++)
{
if(Stack.empty()||s[i]!=Stack.top())
{
Stack.push(s[i]);
}
else
{
Stack.pop();
}
}
string str;
while(!Stack.empty())
{
str+=Stack.top();
Stack.pop();
}
reverse(str.begin(),str.end());
return str;
}
};
150. 逆波兰表达式求值
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<long long> Stack;
for(int i=0;i<tokens.size();i++)
{
if(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="*"||tokens[i]=="/")
{
long long num1=Stack.top();
Stack.pop();
long long num2=Stack.top();
Stack.pop();
if (tokens[i] == "+") Stack.push(num2 + num1);
if (tokens[i] == "-") Stack.push(num2 - num1);
if (tokens[i] == "*") Stack.push(num2 * num1);
if (tokens[i] == "/") Stack.push(num2 / num1);
}
else
Stack.push(stoll(tokens[i]));
}
long long num=Stack.top();
Stack.pop();
return num;
}
};