一般都是在学完线性表(顺序表和链表)之后,才会去学习栈和队列,因此可能会觉得栈和队列是一种新的数据结构,其实不然。它们逻辑上还是一对一的关系,所以说它们本质还是线性表,只不过是加了一定限制的线性表,具体加了哪些限制,且听我娓娓道来。

这是一个线性表,我们可以对这个这个线性表内的任何一个元素进行需要的操作,我可以删掉既不是头也不是尾的[ 2 ]号元素,也可以在 [ 1 ]号位插入新的元素,就是说你对这个线性表里面的任何一个元素操作都是可以的,现在你把它放依次放到一个杯子里面。

可以看到最先进去的[ 0 ]号在杯子的最下面,最后进去的[ 3 ]号在杯子的最上面,当你想取[ 0 ]号的时候你先得依次取出[ 3 ], [ 2 ], [ 1 ],因为这个杯子就只有一个口,这个口在最上面。
而我们的栈就是对线性表人为的进行了类似杯子的这种限制,满足这个线性表只能在一端操作,即第一个进去的最后一个出来,最后一个进去的第一个出来——FILO(First In Last Out)或者 最后一个进去的第一个出来,第一个进去的最后一个出来——LIFO(Last In Fast Out),也就是只能对栈顶元素操作。
看起来是对原来线性表的尾插和尾删,在栈中有了新的名词分别叫做压栈(push)和出栈/弹出(pop)


在Java常用的有两种方式实现一个栈

第一种:

Stack<> stack = new Stack<>();

第二种:

Deque<> stack = new LinkedList<>();

都有常用的三个方法

push():压栈。
peek():查看栈顶元素(就是放入杯子中线性表的最后一个元素)。
pop():删除栈顶元素,并且返回被删除元素的值。

下面通过代码来看:

第一种:

import java.util.Stack;public class Demo {public static void main(String[] args) {Stack<String> stack = new Stack<>();stack.push("我");stack.push("爱");stack.push("中");stack.push("国");System.out.println(stack);System.out.println(stack.empty());System.out.println(stack.isEmpty());System.out.println(stack.peek());System.out.println(stack.pop());System.out.println(stack);}
}

运行结果:

第二种:

import java.util.Deque;
import java.util.LinkedList;public class Demo {public static void main(String[] args) {Deque<String> stack = new LinkedList<>();stack.push("我");stack.push("爱");stack.push("中");stack.push("国");System.out.println(stack);System.out.println(stack.peek());System.out.println(stack.pop());System.out.println(stack);System.out.println(stack.isEmpty());}
}

运行结果:

需要注意的是第一种栈压栈时实际是线性表的尾插,第二种栈压栈时是线性表的头插,所以才会会看到在打印时,第一种是“我爱中国”,第二种是“国中爱我”。


队列

还是那个线性表,只不过这次不是装到杯子里而是将它塞入一根管子

所以这次对线性表的限制是新的元素只能从队尾插入,想操作的话也只能操作位于队首的元素。
在Java中通常这么实现一个队列

 Queue<> queue = new LinkedList<>();

它的常用方法:

add():插入一个元素。
remove():删除队首元素,并且返回该元素的值。
element():查看队首元素。

下面通过代码来看:

import java.util.LinkedList;
import java.util.Queue;public class Demo {public static void main(String[] args) {Queue<String> queue = new LinkedList<>();queue.add("a");queue.add("b");queue.add("c");System.out.println(queue);System.out.println(queue.peek());System.out.println(queue.element());System.out.println(queue.remove());System.out.println(queue);}
}

运行结果:


以上就是对栈和队列的简单介绍,如果理解有偏差还请各位看官在评论区指正,谢谢。

用Java描述数据结构之栈和队列,以及栈和队列的常用方法相关推荐

  1. 用Java描述数据结构之线性表的链式存储(链表),模拟LinkedList实现

    上一篇介绍了顺序表:用Java描述数据结构之线性表的顺序存储(顺序表),ArrayList及其方法的介绍 上一篇博客中说明了什么是线性表--线性表就是一个个数据元素逻辑上以一对一的相邻关系(但是在物理 ...

  2. 用Java描述数据结构之线性表的顺序存储(顺序表),ArrayList及其方法的介绍

    我们先来想一想什么是线性表? 线性表是最基本.最简单.也是最常用的一种数据结构.线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列. 线性表中数据元素之 ...

  3. 用Java描述数据结构之二叉树,前序遍历,中序遍历,后序遍历

    什么是二叉树? 一棵二叉树是节点的一个有限集合,该集合或者为空,或者是由一个节点加上两棵别称为左子树和右子树的二叉树组成. 根据二叉树的概念,可以知道二叉树有以下两个特点: 1.每个节点最多有两棵子树 ...

  4. Java描述 数据结构与算法

    算法:NonextremeElement(S[], n) 输入:由n个整数构成的集合S 输出:其中的任一非极端元素 { 任取的三个元素x, y, z ∈ S; //既然S是集合,这三个元素必互异 通过 ...

  5. 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  6. 数据结构之数组、链表、栈和队列

    1.数组 1.1:概念 数组是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据.这里我们要抽取出三个跟数组相关的关键词:线性表,连续内存空间,相同数据类型:数组具有连续的内存空 ...

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

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

  8. 408考研数据结构与算法之数组、链表、队列、栈知识点和算法详细教程(更新中)

    第一章:数据结构与算法概述 因为数据结构作为计算机专业的专业基础课程,是计算机考研的必考科目之一,如果打算报考计算机专业的研究生,你必须学好它. 数据结构是计算机软考.计算机等级考试等相关考试的必考内 ...

  9. JAVA SE学习day_12:集合的排序、队列、栈结构

    一.集合的排序 1.1 集合的排序 集合的工具类java.util.Collections提供了一个静态方法sort,可以对List集合 进行自然排序,即:从小到大 除了自然排序之外还有反转.乱序方法 ...

最新文章

  1. MongoDB sharding迁移那些事(一)
  2. Design Pattern - Memento(C#)
  3. 泛读:CVPR2014:Discriminative Deep Metric Learning for Face Verification in theWild
  4. MySQL中常见的单行函数(上)
  5. MySQL总结连接查询
  6. 【BZOJ - 4337】BJOI2015 树的同构(树哈希)
  7. python iterableiterator
  8. 爬虫 requests 模块
  9. mac java tomcat_mac平台tomcat部署web项目
  10. 程序运行中(BSS段、数据段、代码段、堆栈)
  11. Windows 8实例教程系列 - 数据绑定高级实例
  12. 个税倒推收入的计算器_手把手教你做个税计算器(1)
  13. python3.6+Appium实现手机微信自动回复
  14. oracle临时表空间占用率过高,ORACLE 临时表空间使用率过高的原因及解决方案
  15. Week 2 Sequence Labelling
  16. 51单片机——ADC模数转换、DAC数模转换PWM C语言入门编程
  17. 写一函数,将一个3*3的整型矩阵转置
  18. 关于日期插件在chrome中出现被遮挡的问题
  19. 电脑黑屏只有鼠标箭头怎么修复 电脑开机黑屏的修复办法
  20. 轻松获取图片和视频文件的Exif信息-Java篇

热门文章

  1. ubuntu 14.04 将窗体button移到右边
  2. Java实现邮箱找回密码
  3. Traffic Manager Overview
  4. delphi 同盘移动文件所用时间测试(文件大小约6,083,545,088 字节)
  5. sde在DBMS中的存储表结构
  6. 实现跨域访问---同源策略 、常见跨域方法
  7. session一些基本的东西
  8. window+VS+OpenCV编译libfacedetection库进行人脸检测
  9. jupyter notebook使用入门2——创建一个基于scikit-Learn的线性预测ipynb文件
  10. 梯度与散度与拉普拉斯算子