基础算法:栈系列

目录

一、删除字符串中的所有相邻重复项

二、比较含退格的字符串

三、基本计算器II

四、字符串解码

五、验证栈序列


栈在解决一些“判断相邻字符是否相等”的场景很有用处。

当然,不要忘记我们也可以借助其他类型来模拟栈的行为。

一、删除字符串中的所有相邻重复项

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;
    }
};

二、比较含退格的字符串

844. 比较含退格的字符串 - 力扣(LeetCode)

也很简单,模拟即可

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

227. 基本计算器 II - 力扣(LeetCode)

用双栈解决

一个栈处理数字,一个栈处理符号,处理符号的栈完全可以用一个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;
    }
};

四、字符串解码

394. 字符串解码 - 力扣(LeetCode)

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();
    }
};

五、验证栈序列

946. 验证栈序列 - 力扣(LeetCode)

模拟,创建栈,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;
    }
};

此篇完。今天任务依旧很轻松啊~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值