day 10 第五章 栈与队列

这篇博客介绍了如何使用栈实现队列以及如何用队列实现栈。在栈实现队列的方法中,通过两个栈来模拟队列的操作,push操作直接入栈,pop操作则需要先将一个栈的所有元素转移到另一个栈再出栈。而在队列实现栈的方案中,仅使用一个队列,通过将队列头部的元素移到队尾来模拟栈的出栈操作。这两个实现都需要特别注意元素的转移和操作顺序。

232.用栈实现队列

不知道怎么动手,不会操作。看讲解。

看完视频,自己动手画图,模拟栈和队列的进出操作,push是进栈和入队,pop是出栈和出队。

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

    }
    
    void push(int x) {
        stIn.push(x);
    }
    
    int pop() {                 //将in里面的元素全部入栈到out里面去,再从out里出栈就是模拟出队列
        if(stOut.empty()){      //自己写的时候又写掉了这个,只有当out为空的时候才能入栈,不然顺序会乱
        while(!stIn.empty()){           
            stOut.push(stIn.top());
            stIn.pop();
        }
    }
        int result = stOut.top();
        stOut.pop();                //自己写的时候写掉了这一步,没有将out的第一个元素出栈
        return result;
    }
    
    int peek() {                //注意这里自己没想到
        int res = this->pop();          //调用已有函数,pop是从队列开头移除元素并返回元素
        stOut.push(res);                //调用了pop函数之后出栈了一个元素,再给塞回去
        return res;                     //返回res
    }
    
    bool empty() {
        //return stOut.empty();   这样的问题是什么?因为一开始out是空的,但是元素都已经进入队列了,所以要两个栈都空才行
        return stIn.empty() && stOut.empty();
    }
};

/**
 * 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();
 */

坑很多。

225. 用队列实现栈

有了第一题的经验,这一题感觉可以动手了。用两个队列来模拟栈,但是可以简化一波,用一个队列就行。

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

    }
    
    void push(int x) {
        que.push(x);        //一样push
    }
    
    //注意是先把队头的1个元素插入到队尾,再将这1个元素删除,循环做这个操作直至队里剩第n个元素
    int pop() { //要把队列前n-1个元素都出队,才能出第n个元素,出队之后再入队
        int size = que.size();  //搞一个size记录队列的长度
        size--; //记录前n-1个的长度
        while(size--){      //注意这个size是逐渐减少的,而不是重新入队之后的长度,即将前n-1个元素重新入队尾
            que.push(que.front());
            que.pop();
        }
        int result = que.front();   //此时出栈的就是原始队尾的一个元素
        que.pop();                  //出栈
        return result;
    }   

    
    int top() {
        return que.back();      //栈顶的元素就是队尾的元素
    }
    
    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();
 */

que.front()是出队的那一边,que.back()是入队的那一边。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值