优选算法专题11:栈

栈

目录

栈

试题1:删除字符串中的所有相邻重复项

算法原理

代码编写

试题2:比较含退格的字符串

算法原理

代码编写

试题3:基本计算器II

算法原理

代码编写

试题4:字符串解码

算法原理

代码编写

试题5:验证栈序列

算法原理

代码编写


试题1:删除字符串中的所有相邻重复项

算法原理

解法:模拟栈

代码编写

cpp 复制代码
class Solution 
{
public:
    string removeDuplicates(string s) 
    {
        string ret;
        for(auto ch : s)
        {
            if(ret.size() && ch == ret.back())
            {
                ret.pop_back();
            }
            else
            {
                ret += ch;
            }
        }
        return ret;
    }
};

试题2:比较含退格的字符串

算法原理

解法:模拟栈

代码编写

cpp 复制代码
class Solution 
{
public:
    bool backspaceCompare(string s, string t) 
    {
        return changeStr(s) == changeStr(t);
    }
    string changeStr(string &s)
    {
        string ret;
        for(auto ch : s)
        {
            if(ch != '#')
            {
                ret += ch;
            }
            else
            {
                if(ret.size())
                {
                    ret.pop_back();
                }
            }
        }
        return ret;
    }
};

试题3:基本计算器II

算法原理

解法:模拟栈

遇到操作符:更新操作符栈

遇到数字:提取数字,分情况讨论

根据操作符栈的符号

  • 加号:数字入数字栈
  • 减号:数字的相反数入栈
  • 乘号:直接与数字栈栈顶元素相乘
  • 除号:直接与数字栈栈顶元素相除

代码编写

cpp 复制代码
class Solution 
{
public:
    int calculate(string s) 
    {
        // 用数组模拟栈结构
        vector<int> st;
        int i = 0, 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;
    }
};

试题4:字符串解码

算法原理

解法:模拟栈

遇到数字:提取数字,放入数字栈

遇到左括号:提取后面的字符串,放入字符串栈

遇到右括号:拿出两个栈的栈顶元素解析,放到字符串栈的栈顶元素后面

遇到单独字符:提取字符串,放到字符串栈的栈顶元素后面

代码编写

cpp 复制代码
class Solution 
{
public:
    string decodeString(string s) 
    {
        stack<int> nums;
        stack<string> st;
        st.push("");
        int i = 0, n = s.size();

        while(i < n)
        {
            if(s[i] >= '0' && s[i] <= '9')
            {
                int tmp = 0;
                while(s[i] >= '0' && s[i] <= '9')
                {
                    tmp = tmp * 10 + (s[i] - '0');
                    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] == ']')
            {
                string tmp = st.top();
                st.pop();
                int k = nums.top();
                nums.pop();

                while(k--)
                {
                    st.top() += tmp;
                }

                i++;// 跳过右括号
            }
            else
            {
                string tmp;
                while(i < n && s[i] >= 'a' && s[i] <='z')
                {
                    tmp += s[i];
                    i++;
                }
                st.top() += tmp;
            }
        }
        return st.top();
    }
};

试题5:验证栈序列

算法原理

解法:模拟栈

让元素一直进栈

进栈的同时判断是否出栈,所有元素进栈完后

判断i是否遍历完毕,或者判断栈是否为空

代码编写

cpp 复制代码
class Solution 
{
public:
    bool validateStackSequences(vector<int>& pushed, vector<int>& popped) 
    {
        stack<int> st;
        int i = 0, n = popped.size();
        for(auto x : pushed)
        {
            st.push(x);
            while(st.size() && st.top() == popped[i])
            {
                st.pop();
                i++;
            }
        }
        return i == n;
    }
};
相关推荐
2601_949950634 小时前
练题簿在线免费刷题 从资料整理到考前自测
面试·职场和发展·pdf·word·刷题
hetao17338375 小时前
2026-10-03~04 hetao1733837 的刷题记录
c++·算法
Zootopia6266 小时前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信
longlongzihan6 小时前
从LeetCode 70. 爬楼梯看动态规划:如何精准推导状态转移方程?
c++·算法·leetcode·动态规划
2601_960356387 小时前
2027校招采购岗解析:数学基础如何迁移到需求预测、成本与供应商分析
人工智能·算法
h_a_o777oah7 小时前
【树论】树链剖分:将树形结构转化为线性结构以处理树上路径问题(洛谷 P3384 附C++代码模板)
数据结构·算法·线段树·acm·树链剖分·树论·重链剖分
HEJOO97 小时前
指针的算术运算详解
java·数据结构·算法
Coder-magician8 小时前
《代码随想录》刷题打卡day47:并查集-part01
数据结构·算法·图论
lsc_blog8 小时前
远程和居家办公的经历,技术简历上怎么摆
面试·职场和发展·重构·pdf·求职招聘
垆边人似月.8 小时前
VLAN 资源池(100~200 分档)
数据结构·算法