前言

栈和队列是算法的一个基本的知识点之一。这篇文章主要介绍三道有关栈和队列的算法题。因为篇幅所限,只介绍push和pop这两种方法的实现

  • 用栈实现队列
  • 用队列实现栈
  • 循环队列的实现

用栈实现队列

入队列的功能我们可以用栈的入栈的功能替代。但问题在于出队列的功能怎么实现。

这里有一个问题,就是栈是后入先出的,队列是先进先出的,两者出入的方式不一样。

那么怎么实现方向的一致呢? 我们可以使用两个栈,一个栈用于输入,一个栈用于输出。当发现输出栈为空的时候,把排列的数据从输入栈一个个弹出,“倒入”到 输出栈中,这样的话,数据排列的方向就刚好被逆转过来了,原本在输入栈中处于栈底的数据被置换到输出栈的栈顶,这时候对它出栈也就同时完成了队列的出列的功能。

下面是具体的图示

1.入队列操作: 等同于对入队列进行入栈操作,图示如下

2.出队列操作: 判断当输出栈为空时,先把输入栈的数据依次弹出并加入到输出栈中

步骤1
步骤2

对输出栈栈顶进行出栈操作,即可完成出队列功能

步骤3

具体代码

import 

用队列实现栈

这里同样有两个功能需要我们实现,分别是入栈功能和出栈功能

入栈功能

我们可以用入栈操作模拟实现

出栈功能

我们又来到了关键功能,这时候你能猜到,我们又需要用到两个队列去实现这个出栈功能了

但问题在于,我们还能否通过讲数据从一个队列“倒”到另一个队列的方式逆转数据方向呢? 这是不行的,因为队列先入先出的特性,导致分割后队列的出入方向仍然是不变的。所以我们要换个思路:

一个元素入队列了,我们接下来希望这个队列像栈一样通过pop把它直接弹出来,但是前面还有很多个元素排着队呢,这时我们想,只要把前面排队的所有元素先出列到另外一个辅助队列里面去,接下来不就可以直接把这个元素踢出队列从而模拟出栈了吗?

步骤1
步骤2

当然完成pop操作后我们还要做一件事情,就是辅助队列和主队列互换,以让未来还能按同样的流程再来一次。

具体代码

import 

循环队列的实现

设计循环队列的原因

对于普通的单向队列,在入队列和出队列的时候可能会遇到一种“队列假满”的现象,导致空间的浪费如下图所示

所以我们要做的,就是通过设置头部(front)和尾部(rear)两个指针来区分队列的“满的部分”和“空的部分”,并且允许在填充到数组末尾的时候,能通过回到数组的头部这种循环的方式继续填充数组,从而提高数组空间的利用率。

怎么实现从尾部到头部的循环呢? 我们可以通过取余运算符实现,因为当 i = 数组长度- 1的时候,(i + 1) % 数组长度 = 0,也就是说这个时候指针又从尾部回到了数组的头部

具体代码

class 

栈的输出_算法:栈和队列题目集合(一)相关推荐

  1. java使用队列实现栈思路_算法面试:队列实现栈的方案

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本篇介绍的是如何用两个队列实现栈的问题.这道题作为上一篇文章算法面试:栈实现队列 ...

  2. 栈的输出_栈和队列--十进制转化为二进制

    需求:编写程序使十进制转换成为二进制 分析:十进制转换二进制.如图,只需要不断除以2,然后将余数逆置即可,我们可以将余数依次输入到栈中,利用栈先进后出的特性,再将栈中元素输出即可得到二进制序列 int ...

  3. 栈的输出_程序设计做题笔记:计算表达式(一):栈

    题目要求输入一个四则运算表达式(保证合法,不含空格),输出这个表达式的值. 解决这个问题有两种主要的思路,一种是用栈解决,较为符合人在计算四则运算表达式时的行为,从左向右算过去:另一种思路是递归,把原 ...

  4. C++为什么空格无法输出_算法竞赛C++常用技巧——输入输出优化(防止TLE)

    cin.cout优化 在默认情况下,std::cin/std::cout 是极为迟缓的输入/输出方式,而 scanf/printf 比 std::cin/std::cout 快得多. 可是为什么会这样 ...

  5. 环形队列的输出_数组实现环形队列

    1. 简介 队列是一个有序列表,可以用数组或是链表来实现. 遵循先入先出的原则.即:先存入队列的数据,要先取出.后存入的要后取出 示意图:(使用数组模拟队列示意图) 2. 数组模拟队列 实现思路 队列 ...

  6. c++矩阵连乘的动态规划算法并输出_算法交流: 7215 简单的整数划分问题 【2.7基本算法之算法效率】...

    [题目描述]7215:简单的整数划分问题 by Oler17WA 将正整数n 表示成一系列正整数之和,n=n1+n2+-+nk, 其中n1>=n2>=->=nk>=1 ,k&g ...

  7. python全栈面试题_全栈工程师对Python面试中is和==区别的详细解说!看完真的学到了!...

    面试实习生的时候,当问到 is 和 == 的区别时,很多同学都答不上来,搞不清两者什么时候返回一致,什么时候返回不一致.本文我们来看一下这两者的区别. 我们先来看几个例子: a = "hel ...

  8. c++矩阵连乘的动态规划算法并输出_算法面试必修课,动态规划基础题型归纳(三)

    动态规划(Dynamic Programming,简称DP),是大家都觉得比较难以掌握的算法.为了应付面试,我们经常会背诵一下DP问题的源码,其实,只要理解了思想,掌握基本的模型,然后再来点写代码的套 ...

  9. java 栈和队列实现迷宫代码_算法图解:如何用两个栈实现一个队列?

    本文已收录至 https://github.com/vipstone/algorithm <算法图解>系列. 队列和栈是计算机中两个非常重要的数据结构,经过前面的学习(<队列> ...

最新文章

  1. Normalization 的发展历程
  2. 阿里限流工具 Sentinel
  3. python中一些实用而容易被忽视不常用的库
  4. Spring 入门知识点笔记整理
  5. C语言: 函数调用的开销
  6. 新服务器打包运营级价值几千的H5商城源码
  7. [ZJOI 2006]书架
  8. 最齐全的日用电商设计模板素材,速来收藏
  9. 光伏逆变器MPPT基本算法介绍-李星硕
  10. 数据禾|2001年东四盟地区植被类型分布数据
  11. jenkins构建报错: ssh: connect to host github.com port 22: Connection timed out
  12. 虚拟机实现远程桌面连接
  13. CSS-关于BFC的理解(转)
  14. 将微信和支付宝支付的个二维码合二为一
  15. html做表格(个人简历)
  16. spSellProduct 中,Begin Transaction 和 Commit Transaction 语句被包装在 Begin Try 和 End Try 块之间
  17. layUIselect下拉菜单
  18. 代码REVIEW的一般方法
  19. JAVA 调用摄像头 拍照 实现人脸识别
  20. 数学建模案例MATLAB实例

热门文章

  1. mysql索引别名_Mysql索引知识详谈
  2. 计算机一开机会做什么,新电脑开机需要做什么
  3. 计算机硬件外围设备介绍,天津2012年自考“计算机外围设备使用与维护”课程考试大纲...
  4. java如何批量导入题目_MyBatis 如何批量插入?
  5. 关于Chrome出现Provisional headers are shown无法正常访问的解决方案(其他firefox,360, IE访问正常) (转)...
  6. 字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛
  7. 【BZOJ1030】[JSOI2007] 文本生成器(AC自动机上跑DP)
  8. Codeforces Codeforces Round #383 (Div. 2) E (DFS染色)
  9. Tensorflow 学习二 tf.Session().run
  10. Set的实现类HashSet与TressSet代码实现