代码随想录算法训练营第十天 | 232.用栈实现队列 225. 用队列实现栈 20. 有效的括号 1047. 删除字符串中的所有相邻重复项

232.用栈实现队列

LeetCode题目

注意事项

class MyQueue {
public:
    stack<int> stk1, stk2;
    MyQueue() {}

    void push(int x) { stk1.push(x); }

    int pop() {
        while (!stk1.empty()) {
            stk2.push(stk1.top());
            stk1.pop();
        }
        int result = stk2.top();
        stk2.pop();
        while (!stk2.empty()) {
            stk1.push(stk2.top());
            stk2.pop();
        }
        return result;
    }

    int peek() {
        while (!stk1.empty()) {
            stk2.push(stk1.top());
            stk1.pop();
        }
        int result = stk2.top();
        while (!stk2.empty()) {
            stk1.push(stk2.top());
            stk2.pop();
        }
        return result;
    }

    bool empty() { return stk1.empty(); }
};

225. 用队列实现栈

LeetCode题目

注意事项

  • 队列和栈不同的一点是栈在从一个转移到另一个的时候顺序会反向,而队列则会保持一致;因此需要本体需要多考虑一步,即pop和peak的区别
class MyStack {
public:
    deque<int> que1, que2;

    MyStack() {}

    void push(int x) { que1.push_back(x); }

    int pop() {
        int x = que1.front();
        que1.pop_front();
        while (!que1.empty()) {
            que2.push_back(x);
            x = que1.front();
            que1.pop_front();
        }
        while (!que2.empty()) {
            que1.push_back(que2.front());
            que2.pop_front();
        }
        return x;
    }

    int top() {
        int x;
        while (!que1.empty()) {
            x = que1.front();
            que2.push_back(x);
            que1.pop_front();
        }
        while (!que2.empty()) {
            que1.push_back(que2.front());
            que2.pop_front();
        }
        return x;
    }

    bool empty() { return que1.empty(); }
};

20. 有效的括号

LeetCode题目

注意事项

  • 要考虑的特殊情况很多:
    1.栈为空来左边的情况
    2.栈为空来右边的情况
    3.最后不为空的情况
class Solution {
public:
    bool isValid(string s) {
        stack<char> collect;
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == '(' || s[i] == '{' || s[i] == '[')
                collect.push(s[i]);
            else if (collect.empty())
                return false;
            else {
                if (collect.top() == '(' && s[i] == ')')
                    collect.pop();
                else if (collect.top() == '{' && s[i] == '}')
                    collect.pop();
                else if (collect.top() == '[' && s[i] == ']')
                    collect.pop();
                else
                    return false;
            }
        }
        if (collect.empty())
            return true;
        else
            return false;
    }
};

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

LeetCode题目

注意事项

  • 可以使用string来作为队列和栈,但是当打印的时候顺序和栈是相反的
class Solution {
public:
    string removeDuplicates(string s) {
        string collect;
        for (int i = 0; i < s.size(); i++) {
            if (collect.empty())
                collect.push_back(s[i]);
            else if (collect.back() == s[i])
                collect.pop_back();
            else
                collect.push_back(s[i]);
        }
        return collect;
    }
};
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容