算法———栈

目录

一、算法解析

二、题目

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

(1)题目

(2)解题思路

(3)代码实现

比较含退格的字符串

(1)题目

(2)解题思路

(3)代码实现

基本计算机II

(1)题目

(2)解题思路

(3)代码实现

字符串解码

(1)题目

(2)解题思路

(3)代码实现

​编辑

验证栈序列

(1)题目

(2)解题思路

(3)代码书写


一、算法解析

在一些题目中我们可以使用栈来化简题目

二、题目

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

https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/

(1)题目
(2)解题思路

我们可以用字符串模拟一个栈,如果下一个元素和栈顶元素相同,就pop,反之push

(3)代码实现
cpp 复制代码
class Solution 
{
public:
    string removeDuplicates(string s) 
    {
       string s1;
       for(auto e : s)
       {
         if(s1.size()&&e == s1.back()) s1.pop_back();
         else s1.push_back(e);
       }
       return s1;
    }
};

比较含退格的字符串

https://leetcode.cn/problems/backspace-string-compare/

(1)题目
(2)解题思路

这道题跟上一道题十分相似,我们可以使用一个字符串s1模拟栈,首先选择一个字符串s 遍历他,如果s1不是空串,且当前遍历s的字母是#就pop,其余的情况push当前遍历的s字母,t字符串重复上述操作,使用一个字符串s2,最后判断二者是否相同

(3)代码实现
cpp 复制代码
class Solution
 {
public:
    bool backspaceCompare(string s, string t)
    {
        string s1;
        string s2;
        for(auto e : s)
        {
            if(e!='#')
            s1.push_back(e);
            else
            {
                if(s1.size()) 
                s1.pop_back();
            }
        }
        for(auto e : t)
        {
            if(e!='#')
            s2.push_back(e);
            else
            {
                if(s2.size()) 
                s2.pop_back();
            }
        }
        return s1 == s2;
    }
};

基本计算机II

https://leetcode.cn/problems/basic-calculator-ii/

(1)题目
(2)解题思路

我们可以使用双栈来模拟计算机的过程

(3)代码实现
cpp 复制代码
class Solution 
{
public:
    int calculate(string s) 
    {
        vector<int> st;
        int i = 0;
        int n = s.size();
        char op = '+';
        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');
                    i++;
                }
                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];
                i++;
            }
        }
        int ret = 0;
        for(auto x : st) 
        ret += x;
        return ret;
    }
};

字符串解码

https://leetcode.cn/problems/decode-string/

(1)题目
(2)解题思路

遍历字符串,建立两个栈

如果遇到数字提取提取数字入栈,如果遇到"【" 把后面的字符串提取出来,放入"字符串栈中";

遇到'】' 解析,然后放到"字符串"栈顶的字符串后面,遇到单独的字符提取出来这个字符串,直接放在"字符串"

(3)代码实现

cpp 复制代码
class Solution 
{
public:
    string decodeString(string s) 
    {
        stack<int> nums;
        stack<string> st;
        st.push("");
        int n = s.size();
        int i = 0;
        while(i<n)
        {
           
            if(s[i] >= '0'&& s[i] <= '9')
            {
                 int tmp = 0;
                while(s[i] >= '0' && s[i] <= '9')
                {
                    int x = s[i] - '0';
                    tmp = tmp * 10 + x;
                    i++;
                }
                nums.push(tmp);
            }
            else if(s[i] == '[')
            {
                i++;
                string tmp;
               while(s[i] >= 'a' && s[i] <= 'z')
               {
                  tmp+=s[i];
                  i++;
               }
               st.push(tmp);
            }
            else if(s[i] == ']')
            {
                int k = nums.top();
                nums.pop();
                string s1 = st.top();
                st.pop();
                while(k--)
                {
                    st.top() += s1;
                }
                i++;
            }
            else
            {
                string tmp = "";
                while(i < n && s[i] >= 'a' && s[i] <= 'z')
                {
                    tmp+=s[i];
                    i++;
                }
                st.top() += tmp;
            }
        }
        return st.top();
    }
};

验证栈序列

https://leetcode.cn/problems/validate-stack-sequences/

(1)题目
(2)解题思路

我们可以模拟栈的过程,一直不停的入栈知道和pop相同在出栈,然后重复上述操 作

(3)代码书写
cpp 复制代码
class Solution 
{
public:
    bool validateStackSequences(vector<int>& pushed, vector<int>& popped)
    {
        stack<int> s;
        int j = 0;
        for(int i = 0; i<pushed.size(); i++)
        {
            s.push(pushed[i]);
            while(!s.empty()&&s.top()==popped[j])
            {
                s.pop();
                j++;
            }
        }
        return s.empty();
    }
};
相关推荐
折哥的程序人生 · 物流技术专研3 小时前
Java面试85题图解版 · 特别篇:2026后端高频面试题复盘(算法底层逻辑+高并发架构设计全解析,附Java实战代码)
java·网络·数据库·算法·面试
想吃火锅10054 小时前
【leetcode】14.最长公共前缀js
算法·leetcode·职场和发展
云絮.5 小时前
数据库操作
数据库·mysql·算法·oracle
小林ixn5 小时前
LeetCode 206. 反转链表(迭代 + 递归详解)
算法·leetcode·链表
凡人叶枫6 小时前
Effective C++ 条款17:以独立语句将 newed 对象置入智能指针
java·linux·开发语言·c++·算法
菜鸟‍7 小时前
LeetCode 1 27 和 704 || 两数之和 移除元素 二分查找
算法·leetcode·职场和发展
退休倒计时8 小时前
【每日一题】LeetCode 142. 环形链表 II TypeScript
算法·leetcode·链表·typescript
popcorn_min9 小时前
Digits 手写数字识别:随机森林多分类 + 像素级特征热力图
算法·随机森林·分类
liulilittle9 小时前
拥塞控制:排水终止的两种决策:OR 与 AND
网络·tcp/ip·计算机网络·算法·信息与通信·tcp·通信
weixin_3077791310 小时前
从脚本执行到智能体协作:AI辅助测试能力的范式重构
运维·开发语言·人工智能·算法·测试用例