【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;
    }
};
相关推荐
柯南二号12 分钟前
【Java后端】MyBatis-Plus 原理解析
java·开发语言·mybatis
INS_KF17 分钟前
【C++知识杂记2】free和delete区别
c++·笔记·学习
一只鱼^_25 分钟前
牛客周赛 Round 105
数据结构·c++·算法·均值算法·逻辑回归·动态规划·启发式算法
是阿建吖!26 分钟前
【动态规划】斐波那契数列模型
算法·动态规划
ikkkkkkkl27 分钟前
C++设计模式:面向对象设计原则
c++·设计模式·面向对象
我是哈哈hh32 分钟前
【Node.js】ECMAScript标准 以及 npm安装
开发语言·前端·javascript·node.js
啊阿狸不会拉杆1 小时前
《算法导论》第 27 章 - 多线程算法
java·jvm·c++·算法·图论
重启的码农1 小时前
ggml介绍 (8) 图分配器 (ggml_gallocr)
c++·人工智能·神经网络
火车叨位去19491 小时前
力扣top100(day04-05)--堆
算法·leetcode·职场和发展
数据智能老司机1 小时前
面向企业的图学习扩展——面向图的传统机器学习
算法·机器学习