“栈” 算法

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

1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)

算法原理

复制代码
abbaca要求删除相邻重复项,这里把相同的bb删除之后变成"aaca",还需要把aa删除

把字符串的所有字符依次入栈,当栈顶元素与要插入的元素相同时,把栈顶的元素pop()

代码

cpp 复制代码
class Solution {
public:
    string removeDuplicates(string s) {
        vector<char> arr;
        for(auto ch : s)
        {
            if(arr.empty())
            {
                arr.push_back(ch);
            }
            else
            {
                if(arr.back()==ch)
                {
                    arr.pop_back();
                }
                else
                {
                    arr.push_back(ch);
                }
            }
        }
        string ret;
        for(auto ch : arr)
        {
            ret+=ch;
        }

        return ret;
    }
    

};

2、比较含退格的字符串

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

算法原理

入栈出栈

代码

cpp 复制代码
class Solution {
public:
    bool backspaceCompare(string s, string t) {
        string s_ret;
        for(auto s_ch : s)
        {
            if(s_ch == '#')
            {
                if(s_ret.empty())
                    continue;
                else
                    s_ret.pop_back();
            }
            else
            {
                s_ret+=s_ch;
            }
        }

        string t_ret;
        for(auto t_ch : t)
        {
            if(t_ch == '#')
            {
                if(t_ret.empty())
                    continue;
                else
                    t_ret.pop_back();
            }
            else
            {
                t_ret+=t_ch;
            }
        }

        if(s_ret==t_ret)
            return true;
        else
            return false;

    }
};

3、基本计算器 II

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

算法原理

    • * /

1、'+'直接入栈要加的数,'-'入栈负数

2、'*' '/'把栈顶元素取出来,跟要乘和除的数计算之后插入

3、最后把栈里所有元素加起来

注意:

1、处理不是个位数的情况

2、最开始的符号需要初始化为'+',不然就不会进入最后判断符号的逻辑

代码

cpp 复制代码
class Solution {
public:
    int calculate(string s) {
        //1、没有括号,乘除优先计算,加减符号直接入栈
        //2、处理不是个位数字的情况

        //初始化为'+'
        char cur='+';
        vector<int> ret;
        for(int i=0;i<s.size();)
        {
            if(s[i]==' ')
            {
                i++;
                continue;
            }


            if(s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/')
            {
                cur=s[i++];
                continue;
            }

            //处理不是个位的情况
            long num=0;
            while(s[i] != '+' && s[i] != '-' && s[i] != '*' && s[i] != '/')
            {
                if(i == s.size() || s[i]==' ')
                    break;

                int tmp=s[i++]-'0';
                num*=10;
                num+=tmp;
            }

            if(cur=='+')
            {
                ret.push_back(num);
            }
            else if(cur == '-')
            {
                ret.push_back(-num);
            }
            else if(cur == '*')
            {
                int back=ret.back();
                ret.pop_back();
                back*=num;
                ret.push_back(back);
            }
            else if(cur == '/')
            {
                int back=ret.back();
                ret.pop_back();
                back/=num;
                ret.push_back(back);
            }

        }

        int sum=0;
        for(auto n : ret)
        {
            sum+=n;
        }

        return sum;
    }
};

4、 字符串解码

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

算法原理

这里需要两个栈来存,一个存字符,一个存放数字,分为四种情况

1、'['

直接把后面所有的字母字符串入栈

2、数字

把数字插入数字栈,需要处理不是个位数的情况

3、']'

把两个栈的栈顶元素出栈,然后进行处理解析

4、单个字符串的情况

直接插入字符栈的栈顶元素后面

++注意:++

字符串的栈最开始要插入一个空的栈顶元素,如果最开始字符串就是单独的字符,那么就会直接加载栈顶元素,如果栈顶元素没有值得话,就会出错

代码

cpp 复制代码
class Solution {
public:
    string decodeString(string s) {
        stack<int> int_st;
        stack<string> string_st;
        int n=s.size();

        //栈顶最开始必须有元素
        string_st.push("");

        int i=0;
        while(i<s.size())
        {
            //中间所有元素入栈
            if(s[i] == '[')
            {
                string str1="";
                i++;
                while(i<n && s[i] >= 'a' && s[i] <= 'z')
                {
                    str1+=s[i++];
                }

                string_st.push(str1);
            }
            else if(s[i] == ']')
            {
                //两个栈都出栈,然后进行计算之后加到string_st栈顶
                string str_top=string_st.top();
                string_st.pop();

                int int_top=int_st.top();
                int_st.pop();

                for(int j=0;j<int_top;j++)
                {
                    string_st.top()+=str_top;
                }
                i++;

            }
            else if(s[i]-'0'>=0 && s[i]-'0'<=9)
            {
                //将数字入栈,需要处理不是单个数字的情况
                int num=0;
                while(s[i]-'0'>=0 && s[i]-'0'<=9)
                {
                    int tmp=s[i++]-'0';
                    num*=10;
                    num+=tmp;
                }
                int_st.push(num);
            }
            else//单个字符串,直接插入
            {
                string str3;
                while(i<n && s[i] >= 'a' && s[i] <= 'z')
                {
                    str3+=s[i++];
                }
                
                string_st.top()+=str3;
            }
        }

        return string_st.top();
    }
};

5、验证栈序列

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

算法原理

新建一个栈,把pushed数组元素入栈,如果栈顶元素和poped数组得相同,直接出栈顶元素,然后++pop数组下标位置

代码

cpp 复制代码
class Solution {
public:
    bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
        stack<int> st;
        int j=0;
        for(auto it : pushed)
        {
            st.push(it);
            while(!st.empty() && st.top()==popped[j])
            {
                j++;
                st.pop();
            }
        }

        if(st.empty())
        {
            return true;
        }
        else
        {
            return false;
        }
    }
};
相关推荐
橘子编程35 分钟前
经典排序算法全解析
java·算法·排序算法
waeng_luo35 分钟前
【鸿蒙开发实战】智能数据洞察服务:待回礼分析与关系维护建议算法
算法·ai编程·鸿蒙
风筝在晴天搁浅36 分钟前
代码随想录 279.完全平方数
算法
不穿格子的程序员39 分钟前
从零开始刷算法——字串与区间类经典题:前缀和 + 单调队列双杀
算法·前缀和·哈希表·双向队列·单调队列
坚持就完事了40 分钟前
十大排序算法
数据结构·算法·排序算法
im_AMBER1 小时前
Leetcode 63 定长子串中元音的最大数目
c++·笔记·学习·算法·leetcode
啊董dong1 小时前
noi-11月30日当堂练习
算法·深度优先·图论
小白程序员成长日记2 小时前
2025.11.29 力扣每日一题
数据结构·算法·leetcode
在黎明的反思3 小时前
进程通信之消息队列(IPC)
算法