【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;
    }
};
相关推荐
心仪悦悦2 分钟前
Scala的Array(2)
开发语言·后端·scala
yqcoder25 分钟前
reactflow 中 useNodesState 模块作用
开发语言·前端·javascript
Swift社区36 分钟前
LeetCode - #139 单词拆分
算法·leetcode·职场和发展
baivfhpwxf202336 分钟前
C# 5000 转16进制 字节(激光器串口通讯生成指定格式命令)
开发语言·c#
许嵩6639 分钟前
IC脚本之perl
开发语言·perl
长亭外的少年1 小时前
Kotlin 编译失败问题及解决方案:从守护进程到 Gradle 配置
android·开发语言·kotlin
直裾1 小时前
Scala全文单词统计
开发语言·c#·scala
心仪悦悦1 小时前
Scala中的集合复习(1)
开发语言·后端·scala
JIAY_WX1 小时前
kotlin
开发语言·kotlin