class Solution {
public:
stack<char> stack1;
stack<char> stack2;
string removeDuplicates(string s) {
int size=s.size();
for(int i=0;i<s.size();i++)
{
//将元素逐一压入栈中,且每次进来都与栈顶元素比较
if(stack1.empty()||s[i]!=stack1.top())
{
stack1.push(s[i]);
}
else
{
stack1.pop(); //相同则出栈
size--;
}
}
//将栈中元素压入栈2再出栈(为了恢复元素顺序)
while(!stack1.empty())
{
stack2.push(stack1.top());
stack1.pop();
}
string result="";
while(!stack2.empty())
{
result += stack2.top();
stack2.pop();
}
return result;
}
};
2.逆波兰表达式
假设其他情况核合法,遍历数组,遇到运算符就将栈顶的两个数字弹出作运算后入栈,遇到数字就入栈。最后栈内一定保存的是运算结果,只需要弹出就好了。
class Solution {
public:
stack<long long> stack1;
int evalRPN(vector<string>& tokens) {
for(int i=0;i<tokens.size();i++)
{
//遇见运算符就将栈顶的两个元素进行比较
if(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="*"||tokens[i]=="/")
{
/*注意nums1和nums2先后*/
long long nums1=stack1.top();
stack1.pop();
long long nums2=stack1.top();
stack1.pop();
if(tokens[i]=="+")
{
stack1.push(nums1+nums2);
}
else if(tokens[i]=="-")
{
stack1.push(nums2-nums1);
}
else if(tokens[i]=="*")
{
stack1.push(nums1*nums2);
}
else if(tokens[i]=="/")
{
stack1.push(nums2/nums1);
}
}
else //数字直接入栈
{
stack1.push(stoll(tokens[i]));
}
}
long long result = stack1.top();//结果一定是栈里仅剩的一个元素
stack1.pop();
return result;
}
};