入门级题解:剑指 Offer 09. 用两个栈实现队列

题目

  1. 用两个栈实现一个队列。
  2. 队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。
  3. (若队列中没有元素,deleteHead 操作返回 -1 )

读题

队列:先入先出
栈:先入后出

在队列尾部插入整数和在队列头部删除整数的功能
对外界是个黑盒,内部构造不知道,只输入输出
插入 1 1
删除 null
插入 2 2
删除 null
删除 返回-1
原来比如栈是 1 2 3 4 5
那现在就从尾部插入是 1 2 3 4 5 6
头部删除 就删1 得到2 3 4 5 6

如果只用一个栈,只能入栈,尾部插入比较好实现,直接入栈就可以,但头部删除不方便,得全部出栈
所以设stack1:1 2 3 4 5插入的话就直接入stack1
再设stack2:把stack1中的先出栈再入栈,换个顺序,现在就是 5 4 3 2 1

伪代码

队列尾部插入整数:stack1.push_back()
stack2.push_back(stack1.pop())
队列头部删除整数:stack2.pop

关键代码分析

 if(sta2.empty()){
            while(!sta1.empty()){
            sta2.push(sta1.top());
            sta1.pop();
            }
        }

为什么只有sta2空的时候才把sta1的给他出栈送过来
例子: sta1 从底到top是 a b c d e f
sta2空的
给sta2:f e d c b a
sta2删除一个 f e d c b
sta1 加1 个:sta1: o
如果这时候给sta2:f e d c b o
这样次序就乱了,正确的次序应该是 o f e d c b
所以得sta2空了再颠倒次序。

收获

  1. 建栈:stack sta;
  2. 入栈:sta.push();
  3. 出栈:sta.pop();
  4. sta.pop()是个操作,不是值,用sta.top();

代码

 class CQueue {
    stack <int> sta1;
    stack <int> sta2;
public:
    CQueue() {
     
    }
    //队列尾部插入整数
    void appendTail(int value) {
        sta1.push(value);
        //int top1 = sta1.top();//测试数据
    }
    
    int deleteHead() {
        if(sta2.empty()){
            while(!sta1.empty()){
            sta2.push(sta1.top());
            sta1.pop();
            }
        }
        
        if(sta2.empty()){
            return -1;
        }
        int delItem = sta2.top();
        sta2.pop();
        return delItem;
    }
};

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值