栈专题-1

目录

1简介

2.例题

2.1删除字符串中的所有相邻重复项

2.2比较含退格的字符串

2.3基本计算器2

2.4字符串解码

2.5验证栈序列


 

1简介

没什么好说的,主要是利用栈的思路来解决题目。不一定要用stl提供的stack,有时候自己用个数组或string来模拟,也是很方便的。

2.例题

2.1删除字符串中的所有相邻重复项

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

class Solution {
public:
    string removeDuplicates(string s) {
        string ans="";
        int size=0;
        int index=0;
        int n=s.size();
        while(index<n)
        {
            if(size==0||ans[size-1]!=s[index])
            {
                ans+=s[index];
                size++;
            }
            else
            {
                ans.pop_back();
                size--;
            }
            index++;
        }
        return ans;
    }
};

2.2比较含退格的字符串

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

思路依旧是利用栈,没有太多别的内容

class Solution {
public:
    bool backspaceCompare(string s, string t) {
        string a1,a2;
        int n1=s.size(),n2=t.size();
        int s1=0,t1=0;
        int is=0,it=0;
        while(is<n1)
        {
            if(s[is]=='#')
            {
                if(s1!=0)a1.pop_back(),s1--;
            }
            else
            {
                s1++;
                a1+=s[is];
            }
            is++;
        }
        while(it<n2)
        {
            if(t[it]=='#')
            {
                if(t1!=0)a2.pop_back(),t1--;
            }
            else
            {
                t1++;
                a2+=t[it];
            }
            it++;
        }
        if(a1!=a2)return false;
        return true;
    }
};

2.3基本计算器2

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

class Solution {
public:
    int calculate(string s) {
        stack<int> mp;
        char op = '+';
        int tmp = 0;
        for (auto a : s) {
            if (a >= '0' && a <= '9') {
                tmp *= 10;
                tmp += (a - '0');
            } else if (a == '+' || a == '-' || a == '*' || a == '/') {
                if (op == '+') {
                    mp.push(tmp);
                    tmp = 0;
                } else if (op == '-') {
                    mp.push(-tmp);
                    tmp = 0;
                } else if (op == '*') {
                    int x = mp.top();
                    mp.pop();
                    mp.push(x * tmp);
                    tmp = 0;
                } else if (op == '/') {
                    int x = mp.top();
                    mp.pop();
                    if (tmp != 0)
                        mp.push(x / tmp);
                    tmp = 0;
                }
                op = a;
            }
        }
        if (op == '+') {
            mp.push(tmp);
            tmp = 0;
        } else if (op == '-') {
            mp.push(-tmp);
            tmp = 0;
        } else if (op == '*') {
            int x = mp.top();
            mp.pop();
            mp.push(x * tmp);
            tmp = 0;
        } else if (op == '/') {
            int x = mp.top();
            mp.pop();
            if (tmp != 0)
                mp.push(x / tmp);
            tmp = 0;
        }
        int ans = 0;
        while (!mp.empty()) {
            ans += mp.top();
            mp.pop();
        }
        return ans;
    }
};

2.4字符串解码

394. 字符串解码 - 力扣(LeetCode)

思路很清晰,就是用栈模拟。

class Solution {
public:
    string decodeString(string s) {
        stack<string> a;
        a.push("");
        stack<int> b;
        int n = s.size();
        int i = 0;
        while (i < n) {

            if (s[i] >= '0' && s[i] <= '9') {
                int x = s[i] - '0';
                i++;
                while (i < n && s[i] >= '0' && s[i] <= '9') {
                    x = x * 10 + (s[i] - '0');
                    i++;
                }
                b.push(x);
            }
            else if (s[i] == '[') {
                i++;
                string tmp = "";
                while (i < n && s[i] >= 'a' && s[i] <= 'z') {
                    tmp += s[i];
                    i++;
                }
                a.push(tmp);
            }
            else if (s[i] == ']') {
                string x = a.top();
                a.pop();
                int z = b.top();
                b.pop();
                string tmp = "";
                for (int j = 0; j < z; j++) {
                    tmp += x;
                }
                i++;
                a.top() += tmp;
            }
            else if (s[i] >= 'a' && s[i] <= 'z') {
                string tmp = "";
                while (i < n && s[i] >= 'a' && s[i] <= 'z') {
                    tmp += s[i];
                    i++;
                }
                a.top() += tmp;
            }
        }
        return a.top();
    }
};

2.5验证栈序列

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

思路就是模拟栈的Push和Pop。不符合直接false即可

class Solution {
public:
    bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
        int shi=0,opi=0;
        stack<int>mp;
        int n=pushed.size(),m=popped.size();
        while(shi<n&&opi<m)
        {
            mp.push(pushed[shi++]);
            while (opi < m &&!mp.empty() && popped[opi] == mp.top())
            {
                mp.pop();
                opi++;
            }
        }
        if(opi==m)return true;
        return false;
    }
};

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值