【C++算法】栈

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

  • 题目链接

删除字符中的所有相邻重复项https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/description/

  • 算法原理
  • 代码展示
cpp 复制代码
class Solution 
{
public:
    string removeDuplicates(string s) 
    {
        string ret;
        for(int i = 0; i < s.size(); i++)
        {
            if(!ret.empty() && ret.back() == s[i])
            {
                ret.pop_back();
            }
            else
            {
                ret += s[i];
            }
        }

        return ret;
    }
};

比较含退格的字符串

  • 题目链接

比较含退格的字符串https://leetcode.cn/problems/backspace-string-compare/description/

  • 算法原理

解法:用栈思想模拟即可

  • 代码展示
cpp 复制代码
class Solution 
{
public:
    bool backspaceCompare(string s, string t) 
    {
        return comString(s) == comString(t);
    }

    string comString(string s)
    {
        string ret;
        for(auto ch : s)
        {
            if(ch != '#') 
            {
                ret += ch;
            } 
            else
            {
                if(!ret.empty())
                {
                    ret.pop_back();
                }
            }
        }
        return ret;
    }
};

基本计算器

  • 题目链接

基本计算器https://leetcode.cn/problems/basic-calculator-ii/description/

  • 算法原理
  • 代码展示
cpp 复制代码
class Solution 
{
public:
    int calculate(string s) 
    {
        stack<int> st;
        char op = '+';
        int i = 0, n = s.size();
        while(i < n)
        {
            if(s[i] == ' ')
            {
                i++;
            }
            else if(i < n && s[i] >= '0' && s[i] <= '9')
            {
                int tmp = 0;
                while(i < n && s[i] >= '0' && s[i] <= '9')
                {
                    tmp *= 10;
                    tmp += s[i++] - '0';
                }
                 if(op == '+')
                {
                    // 直接入栈
                    st.push(tmp);
                }
                else if(op == '-')
                {
                    // -tmp入栈
                    st.push(-tmp);
                }
                else if(op == '*')
                {
                    // tmp乘栈顶元素,并放在栈顶
                    st.top() *= tmp;
                }
                else
                {
                    // 栈顶元素除tmp,并放在栈顶
                    st.top() /= tmp;
                }
            }
            else
            {
                op = s[i++];
            }
        }
        int ret = 0;
        while(st.size())
        {
            ret += st.top();
            st.pop();
        }

        return ret;
    }
};

字符串解码

  • 题目链接

字符串解码https://leetcode.cn/problems/decode-string/description/

  • 算法原理
  • 代码展示
cpp 复制代码
class Solution 
{
public:
    string decodeString(string s) 
    {
        stack<string> str;
        stack<int> num;
        str.push("");
        int i = 0, n = s.size();
        while(i < n)
        {
            if(i < n && s[i] >= '0' && s[i] <= '9')
            {
                int tmp = 0;
                while(i < n && s[i] >= '0' && s[i] <= '9')
                {
                    tmp *= 10;
                    tmp += s[i++] - '0';
                }
                num.push(tmp);
            }
            else if(i < n && s[i] == '[')
            {
                i++;
                string tmp;
                while(i < n && s[i] >= 'a' && s[i] <= 'z')
                {
                    tmp += s[i++];
                }
                str.push(tmp);
            }
            else if(i < n && s[i] == ']')
            {
                i++;
                int tmpNum = num.top();
                num.pop();
                string tmpString = str.top();
                while(--tmpNum)
                {
                    str.top() += tmpString;
                }
                tmpString = str.top();
                str.pop();
                str.top() += tmpString;
            }
            else
            {
                str.top() += s[i++];
            }
        }

        return str.top();

    }
};

验证栈序列

  • 题目链接

验证栈序列https://leetcode.cn/problems/validate-stack-sequences/description/

  • 算法原理
  • 代码展示
cpp 复制代码
class Solution 
{
public:
    bool validateStackSequences(vector<int>& pushed, vector<int>& popped) 
    {
        stack<int> ret;
        int i = 0, n = popped.size();
        for(auto x : pushed)
        {
            ret.push(x);
            while(i < n && ret.size() && popped[i] == ret.top())
            {
                ret.pop();
                i++;
            }
        }

        return i == n;
    }
};
相关推荐
Omics Pro1 小时前
Cell封面|衰老生物学开源AI工具包
数据库·人工智能·算法·机器学习·自然语言处理
zhanghaha13142 小时前
Python进阶教程:35_PyQt (保姆级零基础教程)
开发语言·python·pyqt
释厄6232 小时前
多黑洞具现论·物理/生物/金融三域显化·虚拟宇宙黑洞·奇点=0 圆圈
开发语言·数据结构·人工智能·程序人生·安全威胁分析
UIU1144 小时前
递归算法与汉诺塔
c++·学习·算法·c#·递归
Fruit_Caller4 小时前
static
开发语言·c++
用户979984807189 小时前
200 行代码写一个能跑的 AI Agent:不依赖任何框架,只靠 tool-calling 原理
算法
threerocks9 小时前
【Muse实战】X 流量作战室搭建保姆级教程 - 拥有你自己的运营团队
算法
GreenTea9 小时前
深度拆解 ScienceBuddy:如何用“双层递归自进化”构建高可靠科研 Agent Harness
前端·后端·算法
花椒技术9 小时前
2.46 秒生成 5 秒视频:拆解 H3 Max 的模型、推理栈与硬件协同
算法·音视频开发·视频编码
vivo互联网技术9 小时前
ART:妆容迁移框架,重新定义高保真妆容迁移 | ECCV 2026
人工智能·算法·图像识别