栈和队列 part01:理论基础,232.用栈实现队列,225. 用队列实现栈

理论基础

背景知识

栈:先进后出(一个口)
队列:先进先出(两个口)
在这里插入图片描述

各种容器的属性

在这里插入图片描述

232.用栈实现队列

题目

在这里插入图片描述

解题方法(使用两个栈)

  1. 用两个栈共同实现队列

两个栈共同构成队列,元素不重叠,两者都为空说明“队列”为空

  1. stackIn负责吸收新人(push简单),stackOut负责赶走老人(pop和peek麻烦)
    只有当需要 pop 且 stackOut 为空时,需要把stackIn全部吸收过来(保证顺序),否则各司其职

-------------] [------------
stackOut | | stackIn
-------------] [------------
在这里插入图片描述

难点

难点:这两道题的麻烦点都是pop()的实现
犯错:stack.pop()不返回元素,只是出栈操作。stack.top()返回栈顶元素

代码

class MyQueue {
public:
    stack<int> stackIn;
    stack<int> stackOut;
    MyQueue() {

    }
    
    void push(int x) {
        stackIn.push(x);
    }
    
    int pop() {
        if(stackOut.empty()){
            while(!stackIn.empty()){
                stackOut.push(stackIn.top());
                stackIn.pop();
            }
        }
        int result = stackOut.top();
        stackOut.pop();
        return result;

    }
    
    int peek() {
        int temp1 = this->pop();
        stackOut.push(temp1);
        return temp1;
    }
    
    bool empty() {
        if(stackIn.empty()&&stackOut.empty()){
            return true;
        }
        else return false;
    }
};

225. 用队列实现栈

题目

在这里插入图片描述

解题方法(使用一个队列)

  • 巧妙:只用一个队列模拟栈
  • pop 的流程
    1、把队列前q.size()-1个元素依次弹出,加入队列,暴露了原来的队列入口q.back()
    2、把q.back()弹出
    在这里插入图片描述

难点

  1. 和用栈实现队列有什么区别:

1、只用到一个队列,因为队列有两个口,一边出队列一边入队列,不用额外的队列(巧妙)
而栈只有一个口
2、栈仅有一个口top(),队列有出口front()和入口back()

注意事项:

1、push()需要带参数,pop()不需要带参数,记得pop前要存个临时值,不然就失联了
2、这道题的empty判断,直接使用q.empty()就可以了,因为只用到一个队列。而上一题用到了两个栈。

代码

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

    }
    
    void push(int x) {
        q.push(x);
    }
    
    int pop() {
        int size = q.size();
        size--;
        while(size--){
            q.push(q.front());
            q.pop();
        }
        int result = q.front();
        q.pop();
        return result;
    }
    
    int top() {
        return q.back();
    }
    
    bool empty() {
        if(q.empty()){
            return true;
        }
        else return false;

    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值