【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;
    }
};
相关推荐
hh随便起个名3 小时前
力扣二叉树的三种遍历
javascript·数据结构·算法·leetcode
橘子真甜~3 小时前
C/C++ Linux网络编程15 - 网络层IP协议
linux·网络·c++·网络协议·tcp/ip·计算机网络·网络层
小浣熊熊熊熊熊熊熊丶3 小时前
《Effective Java》第25条:限制源文件为单个顶级类
java·开发语言·effective java
啃火龙果的兔子4 小时前
JDK 安装配置
java·开发语言
星哥说事4 小时前
应用程序监控:Java 与 Web 应用的实践
java·开发语言
等....4 小时前
Miniconda使用
开发语言·python
zfj3214 小时前
go为什么设计成源码依赖,而不是二进制依赖
开发语言·后端·golang
醇氧4 小时前
org.jetbrains.annotations的@Nullable 学习
java·开发语言·学习·intellij-idea
Java&Develop4 小时前
Aes加密 GCM java
java·开发语言·python
weixin_462446234 小时前
使用 Go 实现 SSE 流式推送 + 打字机效果(模拟 Coze Chat)
开发语言·后端·golang