目录
栈在解决一些“判断相邻字符是否相等”的场景很有用处。
当然,不要忘记我们也可以借助其他类型来模拟栈的行为。
一、删除字符串中的所有相邻重复项
1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)

比如该题,我们可以用字符串来模拟栈的行为
class Solution {
public:
string removeDuplicates(string s) {
string ret;
for(char&ch:s)
{
if(ret.size()&&ret.back()==ch)ret.pop_back();
else ret+=ch;
}
return ret;
}
};
二、比较含退格的字符串

也很简单,模拟即可
class Solution {
public:
bool backspaceCompare(string s, string t) {
return changStr(s)==changStr(t);
}
string changStr(string str)
{
string ret;
for(char&ch:str)
{
if(ch!='#')ret+=ch;
else
{
if(ret.size())ret.pop_back();
}
}
return ret;
}
};
三、基本计算器II


用双栈解决

一个栈处理数字,一个栈处理符号,处理符号的栈完全可以用一个char来存,初始char类型为'+',遇到符号更新char为遍历到的符号遇到空格特殊判断,遇到数字,先处理数字,处理完,检查char,+直接进栈,-负数进栈,*栈顶元素乘等于遍历到的数,/栈顶元素除等于遍历到的数。
关于连续数字处理,比如123,遇到连续数字先存tmp为栈顶元素,然后tmp乘10再加下一个元素就实现了连续数字处理。
对于符号我们可以只用一个char来存,对于数据我们可以创建数组模拟栈
class Solution {
public:
int calculate(string s) {
//数组模拟栈
vector<int> st;
char op='+';
int i=0,n=s.size();
while(i<n)
{
//空格特殊判断
if(s[i]==' ')++i;
//数字
else if(s[i]>='0'&&s[i]<='9')
{
//处理连续数字
int tmp=0;
while(i<n&&s[i]>='0'&&s[i]<='9')
tmp=tmp*10+(s[i++]-'0');
//分类入栈,此时op是该数之前的符号
if(op=='+')st.push_back(tmp);
else if(op=='-')st.push_back(-tmp);
else if(op=='*')st.back()*=tmp;
else st.back()/=tmp;
}
//符号
else
{
op=s[i++];
}
}
int ret=0;
for(int&x:st)ret+=x;
return ret;
}
};
四、字符串解码



class Solution {
public:
string decodeString(string s) {
stack<int> nums;
stack<string> st;
st.push("");
int i=0,n=s.size();
while(i<n)
{
if(s[i]>='0'&&s[i]<='9')
{
//取数
int tmp=0;
while(i<n&&s[i]>='0'&&s[i]<='9')
{
tmp=tmp*10+(s[i++]-'0');
}
nums.push(tmp);
}
else if(s[i]=='[')
{
++i;
string tmp;
while(s[i]>='a'&&s[i]<='z')
{
tmp+=s[i++];
}
//压栈,等待]匹配
st.push(tmp);
}
else if(s[i]==']')
{
int k=nums.top();
string str=st.top();
nums.pop();
st.pop();
while(k--)
{
st.top()+=str;
}
++i;
}
//直接就是字符串
else
{
st.top()+=s[i++];
}
}
return st.top();
}
};
五、验证栈序列

模拟,创建栈,i初始化0遍历出栈序列,持续压栈,满足出栈条件也就是栈顶和出栈序列i位置元素相同,持续出栈,最后i==popped size就是全部出完
class Solution {
public:
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
stack<int> st;
int i=0,n=popped.size();
for(int&x:pushed)
{
st.push(x);
while(st.size()&&st.top()==popped[i])
{
st.pop();
++i;
}
}
return i==n;
}
};
此篇完。今天任务依旧很轻松啊~~~
2700

被折叠的 条评论
为什么被折叠?



