150 逆波兰表达式
一开始想复杂了 想着用两个stack来解决 一看答案发现这么简单
class Solution {
public:
int evalRPN(vector<string>& tokens)
{
int res;
stack<int>st;
for(int i=0;i<tokens.size();i++)
{
if(i>1&&(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="*"||tokens[i]=="/"))
{
int num1 =st.top();
st.pop();
int num2 = st.top();
st.pop();
if (tokens[i] == "+") st.push(num2 + num1);
if (tokens[i] == "-") st.push(num2 - num1);
if (tokens[i] == "*") st.push(num2 * num1);
if (tokens[i] == "/") st.push(num2 / num1);
}
else
{
st.push(stoi(tokens[i]));
}
}
return st.top();
}
};
1047 删除字符串中所有的相邻重复项
比较简单
class Solution {
public:
string removeDuplicates(string s)
{
string res;
stack<char>st;
st.push(s[0]);
for(int i=1;i<s.size();i++)
{
if(st.empty()||s[i]!=st.top()) st.push(s[i]);
else st.pop();
}
while(!st.empty())
{
res+=st.top();
st.pop();
}
reverse(res.begin(),res.end());
return res;
}
};
20 有效的括号
class Solution {
public:
bool isValid(string s)
{
if(s.size()%2!=0) return false;
stack<char>st;
for(int i=0;i<s.size();i++)
{
if(s[i]=='(')st.push(')');
else if(s[i]=='[')st.push(']');
else if(s[i]=='{')st.push('}');
else if(st.empty()||st.top()!=s[i]) return false;
//())) (]])
else st.pop();
}
return st.empty(); //[[[]
}
};
代码中注释了 要解决的对应异常情况。