美文网首页
用两个栈实现一个队列&用两个队列实现一个栈

用两个栈实现一个队列&用两个队列实现一个栈

作者: CXYMichael | 来源:发表于2018-12-25 21:01 被阅读12次

1. 两个栈实现一个队列

栈的先进后出特性非常适合处理多层闭合问题,比如括号处理、函数的递归调用、树的遍历、汉诺塔等。


Stack_Queue

要用两个栈实现一个队列,则需要两个容量相等的堆栈(不等的话合也可以,就是判断逻辑比较复杂,而且容量受较小堆栈的容量限制),记作S1和S2,堆栈容量记作c。

入队

如果S1未满,则push到S1;
如果S1满了,且S2为空,则将S1所有元素push到S2,再尝试push到S1;
如果以上条件都不成立,则队列已满。

出队

如果S2非空,则从S2中pop元素;
如果S2为空,且S1非空,则将S1所有元素push到S2,再尝试从S2中pop元素;
如果以上条件都不成立,则队列为空。

队列长度

这个队列的长度等于S1 S2深度之和,故最大长度为2c,但是存在长度不到2c就写满的情况。因为S1和S2之间必须保证数据的顺序性,所以每次S1和S2交换数据时必须保证S2为空且S1数据全部移动过去。即便队列长度没有达到2c,如果S1写满且无法移动到S2,仍然认为队列已满。

2. 两个队列实现一个栈

队列的结构则相对比较简单,先进的元素先出来,在进程、线程、消息管理等场景下经常用到队列。
要用 两个队列实现一个栈,则需要两个容量相等的队列(不等的话合成的堆栈的容量等于最小队列的容量),记作Q1和Q2,队列容量记作c。


Queue_Stack

入栈

取一个非空队列;
如果队列满了,则堆栈已满;
否则push_back一个元素(入栈)。

出栈

如果两个队列都为空,则堆栈为空;
否则取一个非空队列,将除队尾的那个元素全部pop_front到另一个队列,最后后将队尾元素取出(出栈)。

堆栈深度

堆栈深度即为c。

相关文章

  • LeetCode 每日一题 [43] 用两个栈实现队列

    LeetCode 用两个栈实现队列 [简单] 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appen...

  • 剑指Offer

    09 用两个栈实现队列 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 del...

  • 面试题9: 用两个栈实现队列

    9-1 用两个栈实现队列 9-2 用两个队列实现栈

  • 剑指Offer(五)

    剑指Offer(五) 用两个栈实现队列 题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列...

  • 栈和队列的相互实现

    两个栈实现队列: 一个栈用来入,一个栈用来出 两个队列实现栈: 入栈的时候正常存入一个队列,出栈的时候用另一个队列...

  • 总结的笔试/面试算法题

    目录 1. 栈和队列1.用两个队列实现栈2.用两个栈实现队列3.实现一个栈,可以用常数级时间找出栈中的最小值4.判...

  • LeetCode题解之用两个栈实现队列

    用两个栈实现队列 题目描述 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 d...

  • 面试题09. 用两个栈实现队列

    用两个栈实现队列 题目描述 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 d...

  • 栈&队列

    一、栈&队列总结 栈/队列的应用接雨水验证栈序列滑动窗口的最大值 栈/队列的特殊实现用两个栈实现队列用两个队列实现...

  • 剑指offer之栈队列堆

    [TOC] 9. 用两个栈实现队列 用两个栈来实现一个队列,完成队列的 Push 和 Pop 操作。 mysolu...

网友评论

      本文标题:用两个栈实现一个队列&用两个队列实现一个栈

      本文链接:https://www.haomeiwen.com/subject/jzzphqtx.html