“栈” 算法

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;
        }
    }
};
相关推荐
budingxiaomoli3 分钟前
分治算法-快排
数据结构·算法
云泽80814 分钟前
C++ STL 栈与队列完全指南:从容器使用到算法实现
开发语言·c++·算法
前端小白在前进1 小时前
力扣刷题:复原IP地址
tcp/ip·算法·leetcode
yaoh.wang1 小时前
力扣(LeetCode) 94: 二叉树的中序遍历 - 解法思路
python·算法·leetcode·面试·职场和发展·二叉树·跳槽
Evand J1 小时前
【课题推荐】基于视觉(像素坐标)与 IMU 的目标/自身运动估计(Visual-Inertial Odometry, VIO),课题介绍与算法示例
人工智能·算法·计算机视觉
xu_yule1 小时前
算法基础(背包问题)—分组背包和混合背包
c++·算法·动态规划·分组背包·混合背包
蓝色汪洋1 小时前
数码串和oj
数据结构·算法
努力学算法的蒟蒻1 小时前
day39(12.20)——leetcode面试经典150
算法·leetcode·面试
科学最TOP2 小时前
xLSTM-Mixer:基于记忆混合的多变量时间序列预测
大数据·人工智能·算法·机器学习·时间序列
xlq223222 小时前
29.哈希(下)
算法·哈希算法·散列表