代码随想录第九天:栈、队列、括号匹配、字母消除

1.用栈实现队列

题目链接:. - 力扣(LeetCode)

讲解链接:代码随想录 (programmercarl.com)

视频链接:栈的基本操作! | LeetCode:232.用栈实现队列_哔哩哔哩_bilibili

本体使用栈实现队列的功能。共需使用两个栈:输入栈与输出栈。

首先是入队功能,入队功能很简单,只需要将新元素加入输入栈即可。

重点是出队功能,队列是先入先出。而队列的对头元素在输入栈的底部,不能直接输出。所以需要另一个栈来辅助。将输入栈的顶部元素一一移动到输出栈中,就完成了栈内元素的反转,此时再将输出栈的顶部元素输出,就完成了对头元素的输出。每次出队后,要将输出栈的元素全部清空。

然后是查看队首元素,该操作只需要进行一次出队,再将出队的元素加入输出栈即可。

最后是查询队列是否为空,只需检查输入输出栈是否全为空即可。

代码如下:

class MyQueue {
public:
    stack<int> stIn;
    stack<int> stOut;
    MyQueue() {

    }

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

    int pop() {
        if (stOut.empty()){
            while (!stIn.empty()){
                stOut.push(stIn.top());
                stIn.pop();
            }
        }
        int result = stOut.top();
        stOut.pop();
        return result;
    }

    int peek() {
        int res = this->pop();
        stOut.push(res);
        return res;
    }

    bool empty() {
        return stOut.empty() && stIn.empty();
    }
};

tips:peek()复用了pop()的代码会减少出错的可能,相较于直接复制代码更好。

2.用队列实现栈

题目链接:. - 力扣(LeetCode)

讲解链接:代码随想录 (programmercarl.com)

视频链接:队列的基本操作! | LeetCode:225. 用队列实现栈_哔哩哔哩_bilibili

本体要用队列来实现栈的功能,同样也需要两个队列。

入栈功能很简单,只需要把元素加入队列1即可。

同样重点在于出栈功能,出栈元素是队列1尾部的元素。实现方式是:出栈时,将队列1尾部元素之前的所有元素复制到队列2中,再将尾部元素输出。最后将队列2复制到队列1,清空队列2即可。

查看栈顶元素功能也一样,进行一次出栈后,将出栈元素重新加入队列1即可。

查看栈是否为空只需要检查队列1是否为空即可。

代码如下:

class MyStack {
public:
    queue<int> que1;
    queue<int> que2;
    MyStack() {

    }

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

    int pop() {
        int size = que1.size();
        size--;
        while (size--){
            que2.push(que1.front());
            que1.pop();
        }
        int result = que1.front();
        que1.pop();
        que1 = que2;
        while (!que2.empty()){
            que2.pop();
        }
        return result;
    }

    int top() {
        int res = this->pop();
        que1.push(res);
        return res;
    }

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

3.括号匹配

题目链接:. - 力扣(LeetCode)

讲解链接:代码随想录 (programmercarl.com)

视频链接:栈的拿手好戏!| LeetCode:20. 有效的括号_哔哩哔哩_bilibili

本题是使用栈的经典问题。

如果遇到左括号则入栈,遇到右括号则持续判定是否与上一个括号匹配,匹配则弹出相应左括号。要注意如果栈为空时,此时要入栈的元素是右括号,则此时匹配一定不成功。

代码如下:

bool isValid(string s) {
    stack<char> st;
    for (int i = 0; i < s.length(); ++i) {
        if (st.empty() && (s[i] == ')' || s[i] == ']' || s[i] == '}'))
            return false;
        if (s[i] == '(' || s[i] == '[' || s[i] == '{'){
            st.push(s[i]);
        }else if (s[i] == ')'){
            if (st.top() == '(')
                st.pop();
            else
                st.push(s[i]);
        }else if (s[i] == ']'){
            if (st.top() == '[')
                st.pop();
            else
                st.push(s[i]);
        }else if (s[i] == '}'){
            if (st.top() == '{')
                st.pop();
            else
                st.push(s[i]);
        }
    }
    if (st.empty())
        return true;
    else
        return false;
}

4.字母消除

题目链接:. - 力扣(LeetCode)

讲解链接:代码随想录 (programmercarl.com)

视频链接:栈的好戏还要继续!| LeetCode:1047. 删除字符串中的所有相邻重复项_哔哩哔哩_bilibili

本体与括号匹配类似,使用栈来解决。

每次比较栈顶元素与待入栈元素是否相同,如果不同则入栈,否则将栈顶元素弹出。

要注意本体要返回消除后的字符串,所以需要将栈的内容加入字符串,但是栈的输出顺序与实际顺序相反。可以将字符串反转(自定义函数),也可以使用第二个栈输出。

代码如下:

string removeDuplicates(string s) {
    stack<char> stIn;
    stack<char> stOut;
    for (char i : s) {
        if (!stIn.empty()){
            if(i == stIn.top())
                stIn.pop();
            else
                stIn.push(i);
        }else
            stIn.push(i);
    }
    string str;
    while (!stIn.empty()){
        stOut.push(stIn.top());
        stIn.pop();
    }
    while (!stOut.empty()){
        str += stOut.top();
        stOut.pop();
    }
    return str;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值