目录

栈 (算法十二)

1.删除字符串中的所有相邻项

link:1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)

思路:

栈+模拟

code

复制代码
class Solution {
public:
    string removeDuplicates(string s) {
        // 栈来模拟即可
        // string代替栈
        string ans;
        for(int i = 0; i < s.size(); i++)
        {
            if((!ans.empty()) && ans.back() == s[i]) ans.pop_back();
            else ans.push_back(s[i]);
        }
        return ans;
    }
};

2.比较含退格的字符串

link:844. 比较含退格的字符串 - 力扣(LeetCode)

思路

栈 + 模拟

code

复制代码
class Solution {
public:
    bool backspaceCompare(string s, string t) {
        return f(s) == f(t);
    }

    string f(string& s)
    {
        string ans;
        for(int i = 0; i < s.size(); i++)
        {
            if(s[i] != '#') ans.push_back(s[i]);
            else if(!ans.empty()) ans.pop_back();
        }
        return ans;
    }
};

3.基本计算器II

link:227. 基本计算器 II - 力扣(LeetCode)

思路:

code

复制代码
class Solution {
public:
    int calculate(string s) {
        string ops("+-*/");
        vector<int> st;
        char op = '+';
        for(int i = 0; i < s.size(); )
        {
            int left = i, right = i + 1;
            while(right < s.size() && ops.find(s[right]) == string::npos) right++;
            printf("left = %d, right = %d\n", left, right);
            // [left, right - 1]都是num; right 为ops
            int num = stoi(string(s.begin() + left, s.begin() + right));
            if (op == '+') st.push_back(num);
            else if(op == '-') st.push_back(-num);
            else if(op == '/')
            {
                int pop = st.back();
                st.pop_back();
                st.push_back(pop / num);
            }
            else if(op == '*')
            {
                int pop = st.back();
                st.pop_back();
                st.push_back(pop * num);
            }
            op = s[right];
            i = right + 1;
        }
        int ans = 0;
        for(const auto& e:st)
        {
            ans += e;
        }
        return ans;
    }
};

4.字符码解码

link:

思路

栈 + 模拟

code

复制代码
class Solution {
public:
    string decodeString(string s) {
        string ans;
        // for(int i = 0; i < s.size(); i++)
        for(const auto& e:s)
        {
            if(e != ']') ans.push_back(e);
            else
            {
                string str;
                // 获取重复字符串
                for(char ch = ans.back(); ch != '['; ans.pop_back(), ch = ans.back()) 
                    str = ch + str;
                ans.pop_back();
                // 获取数字
                string snum = "";
                for(char ch = ans.back(); ch >= '0' && ch <= '9'; )
                {
                    snum = ch + snum;
                    ans.pop_back();
                    if(ans.empty()) break;
                    ch = ans.back();
                }
                int mult = stoi(snum);
                for(int i = 0; i < mult; i++) ans += str;
            }
        }
        return ans;
    }
};

5.验证栈序列

link:946. 验证栈序列 - 力扣(LeetCode)

思路

栈 + 模拟

code

复制代码
class Solution {
public:
    bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
        stack<int> st;
        int idx = 0;
        for(const auto& e:pushed)
        {
            st.push(e);
            while((!st.empty()) && st.top() == popped[idx])
            {
                st.pop();
                idx++;
            }
        }
        return st.empty();
    }
};
本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
Stardep21 分钟前
算法学习11——滑动窗口——最大连续1的个数
数据结构·c++·学习·算法·leetcode·动态规划·牛客网
双叶83628 分钟前
(C语言)学生信息表(学生管理系统)(基于通讯录改版)(正式版)(C语言项目)
c语言·开发语言·c++·算法·microsoft
AQin101234 分钟前
【Leetcode·中等】如何初始化(583.两个字符串的删除操作·Delete Operation for Two Strings)
java·算法·leetcode·动态规划
green5+135 分钟前
LeetCode1两数之和
算法·哈希算法·散列表
hnsqls38 分钟前
LeetCode 精简75 题
算法·leetcode·职场和发展
石去皿41 分钟前
力扣hot100 31-40记录
java·算法·leetcode
不吃元西1 小时前
leetcode 118. 杨辉三角
算法·leetcode·职场和发展
wen__xvn1 小时前
每日一题洛谷P8716 [蓝桥杯 2020 省 AB2] 回文日期c++
c++·算法·蓝桥杯
梭七y1 小时前
【力扣hot100题】(027)两数相加
算法·leetcode·职场和发展
破东风1 小时前
leetcode每日一题:向字符串添加空格
算法·leetcode·模拟