代码随想录算法训练营第九天 | 232.用栈实现队列 225. 用队列实现栈

  • C++中stack queue是容器么?
  •      准确来说,stack,queue都是由C++容器库中的容器实现的,默认是deque,所以stack,queue并不是容器,stack,queue被成为容器适配器。

  • 我们使用的stack,queue是属于哪个版本的STL?
  •      SGI STL 由Silicon Graphics Computer Systems公司参照HP STL实现,被Linux的C++编译器GCC所采用,SGI STL是开源软件,源码可读性甚高 。

  • stack queue提供迭代器来遍历空间么?
  • 由于栈和队列都是有严格进出顺序的数据结构,所以是不具有迭代器的。

232.用栈实现队列 

文档讲解:代码随想录 (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()){
                int tmp = Stin.top();
                Stout.push(tmp);
                Stin.pop();
            }
        }
        int result = Stout.top();
        Stout.pop();
        return result;
    }
    
    int peek() {
        int tmp = this->pop();
        Stout.push(tmp);
        return tmp;
    }
    
    bool empty() {
        if(Stin.empty() && Stout.empty())return true;
        else return false;
    }
};

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue* obj = new MyQueue();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->peek();
 * bool param_4 = obj->empty();
 */

        这里说一下为什么在pop()函数中要先判断if(Stout.empty()),因为如果Stout,也就是引入的第二个数组不为空的话,那么元素出“队列”的顺序会有变化,因为栈是后进先出的。

        另外,在实现peek()函数的时候,因为要找出位于栈顶的元素,所以可以直接调用自身的pop()函数,记录下返回值,重新入栈,这样才能保持栈内元素不变,只是获取了栈顶的元素。

225. 用队列实现栈  

文档讲解:代码随想录 (programmercarl.com)

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

状态:会做,爱做

         书接上回,在用栈实现队列的题目中,我提到了栈的灵活性更低,而且无法改变元素的顺序,所以必须要另一个栈来协助,但是这题不一样,当我们用队列来实现栈的时候,我们可以改变队列中元素的顺序,让新入队的元素放到队头,这样就可以实现一个栈了。下面是我的代码。

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

    }
    
    void push(int x) {
        if(que.empty()){
            que.push(x);
            return;
        }
        int length = que.size();
        que.push(x);
        for(int i = 1;i <= length;i++){
            int tmp = que.front();
            que.pop();
            que.push(tmp);
        }
        
    }
    
    int pop() {
        int result = que.front();
        que.pop();
        return result;
    }
    
    int top() {
        return que.front();
    }
    
    bool empty() {
        return que.empty();
    }
};

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack* obj = new MyStack();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->top();
 * bool param_4 = obj->empty();
 */

        其实就push函数比较的复杂,因为我在push函数中就已经改变了队列中元素的位置,所以,后面的pop,top,empty直接按照栈的逻辑来就好。

        在push函数中,我在将新元素加入队列之前获取了队列的长度,也就是加入新元素之前队列中元素的个数,当加入新元素后,我只需要将加入前每个元素,先出队在入队,这样先进的元素就可以被放在队尾,而新加入的元素就会在队头。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值