代码随想录算法训练营Day10 | 栈与队列理论基础、LeetCode232.用栈实现队列、LeetCode225. 用队列实现栈

栈与堆列理论基础

1、基本特性:栈先进后出,队列先进先出

2、不同STL版本对应其不同实现原理,以SGI STL为例,如果不指定栈的实现原理,默认是deque,当然也可以通过stack<int,std::vector<int>> 方式指定栈的实现原理,因此通常不把栈和堆列称为容器,而称其为container adapter(容器适配器),主要实现原理就是数组和链表的底层实现。

LeetCode232.用栈实现队列

用两个栈来实现数据的倒换,经过两个栈之后,数据就变为符合队列的输出顺序,因此可设置一个输入栈一个输出栈

时间复杂度: push和empty为O(1), pop和peek为O(n)
空间复杂度: O(n)

class MyQueue {
    stack<int> st_in;
    stack<int> st_out;
public:
    MyQueue() {

    }

    void push(int x) {
        st_in.push(x);
    }
    
    int pop() {
        int res;
        if(st_out.empty()){
            while(!st_in.empty()){
                st_out.push(st_in.top());
                st_in.pop();
            }
        }
        if(!st_out.empty()){
            res = st_out.top();
            st_out.pop();
        }
        return res;
    }
    
    int peek() {
        if(st_out.empty()){
            while(!st_in.empty()){
                st_out.push(st_in.top());
                st_in.pop();
            }
        }
        return st_out.top();
    }
    
    bool empty() {
        if(st_in.empty() && st_out.empty()) return true;
        return false;
    }
};

LeetCode225. 用队列实现栈

经过上道题之后惯性思维还是用两个队列模拟一个栈,其实一个堆列就可以,另一个队列起到一个备份的作用,目的就是备份第一个队列的前n-1个元素,然后取出最后一个当作栈的输出,最后恢复现场。

时间复杂度: pop为O(n),top若使用如下代码为O(n),若直接使用que1.back则为O(1)

空间复杂度: O(n)

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

    }
    
    void push(int x) {
        que1.push(x);
    }
    
    int pop() {
        int len1 = que1.size()-1;
        while(len1--){
            que2.push(que1.front());
            que1.pop();
        }
        int res = que1.front();
        que1.pop();
        int len2 = que2.size();
        while(len2--){
            que1.push(que2.front());
            que2.pop();
        }
        return res;
    }
    
    int top() {
        int len1 = que1.size()-1;
        while(len1--){
            que2.push(que1.front());
            que1.pop();
        }
        int res = que1.front();
        que1.pop();
        int len2 = que2.size();
        while(len2--){
            que1.push(que2.front());
            que2.pop();
        }
        que1.push(res);
        return res;
    }
    
    bool empty() {
         return que1.empty();
    }
};

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值