栈和队列的实现,java实现栈和队列数据结构

  栈和队列的实现,java实现栈和队列数据结构

  这篇文章给你带来了一些关于java的知识,包括栈和队列的定义、应用、实现和操作。下面就来看看吧,希望对你有帮助。

  如何解决写爬虫IP受阻的问题?立即使用。

  在学习栈和队列之前,先了解什么是线性表:一次保存同类型的单个元素,多个元素在逻辑上是连续的,比如数组、链表、字符串、栈和队列。

  栈和队列实际上是线性表、数组或链表,操作有限。它们可以在头部或尾部插入和删除,但是栈和队列只能在一端插入和删除。

  

一、栈

  

1.定义

  您只能在一端(堆栈的顶部)插入或删除元素。你可以把栈想象成一个“水杯”。您只能从一端添加元素或从段落中删除元素。而且先入杯的水在杯底,后入杯的水在杯顶。倒出来的时候,也是杯子顶部倒出来的水。所以先入栈的元素后出,后入栈的元素先出。这也是栈的特点:“先进后出,后进先出”(LIFO)。取出元素和添加元素只能在栈顶。

  将1 2 3 4 5放入堆栈中一次。

  

2.栈的应用

  

1.无处不在的undo(撤销)操作

  在任一编辑器中键入错误内容后,使用Ctrl z返回到输入的内容;

  在任一浏览器中单击后退。

  就是堆栈的这种结构的应用。

  1.使用编辑器来使用撤消操作。一旦你输入了,你将把内容推入堆栈,然后你将再次把它推入堆栈。如果发现一次输入错误,就用撤销操作在当前栈顶弹出错误的内容。那么当前栈顶的内容就是最后输入的内容。

  2.浏览网页其实是一样的原理,就像打开百度-打开csdn-打开创意中心一样。也使用这种结构。首先将百度网页推入栈中,然后将csdn网页推入栈中,再将创意中心网页推入栈中。如果想返回csdn主页,按返回箭头弹出当前栈顶的创意中心网页,取出csdn主页。

  

2.操作系统栈

  在程序重新执行的过程中,从A函数调用B函数,从B函数调用C函数。当调用结束,执行返回,怎么知道从哪里继续执行?背后还有堆栈结构。

  

3.栈的实现

  基于链表的堆栈链堆栈

  基于阵列实施的堆栈—顺序堆栈(更常用)

  基于动态数组实现定义堆栈。

  //基于动态数组实现的顺序堆栈公共类mystack

  //记录当前堆栈中的元素数量

  私有int大小;

  //实际存储数据的动态数组。此时,只能在堆栈中的数组末尾添加和删除元素。

  private ListE data=new ArrayList();

  }

4.栈的操作

   1.向堆栈中添加一个元素

  只能添加到堆栈的顶部。

  /**

  *将元素添加到当前栈-栈压操作

  * @param val

  */

  公共无效推送(E值){

  data . add(val);

  尺寸;

  }2.当前一个元素从栈顶弹出

  /**

  *弹出当前顶层元素并返回顶层元素的值。

  * @返回

  */

  public E pop(){

  if (isEmpty()){

  //堆栈为空,无法弹出。

  抛出new NoSuchElementException(堆栈为空!“不能爆!”);

  }

  //删除数组末尾的元素

  e val=data . get(size-1);

  data.remove(大小为1);

  尺寸-;

  返回val

  }3.查看堆栈的当前顶部元素,但它不会弹出

  /**

  *检查当前栈顶元素值,元素不会弹出。

  * @返回

  */

  公共E peek(){

  if (isEmpty()){

  抛出new NoSuchElementException(堆栈为空!“不能偷看!”);

  }

  返回data.get(大小-1);

  }

二、队列

  

1.定义

  队列:先进先出(FIFO)数据结构一、元素只能从队列尾加入队列,只能从队列头出队列。元素的出队顺序和队列顺序是一致的。

  依次排队1 2 3 4 5。

  

2.队列的应用

  现实生活中,各种“排队”操作

  

3.队列的实现

  基于阵列实施的队列顺序队列

  基于链表-链队列的队列

  出列操作只能在队列的头部执行。如果采用由array实现的队列,则每次一个元素出队,所有剩余的元素都必须向前移动一个单位。这时链表实现的队列更适合队列的结构。要删除元素,只需删除头节点,并在链表的末尾添加元素。

  公共接口队列{

  //排队操作

  无效报价;

  //出列操作

  e poll();

  //检查队列头元素

  e peek();

  布尔型isEmpty();}对于栈来说,队列有很多实现子类,比如

  先进先出队列

  双端队列

  循环排队

  优先队列

  无论实现哪个队列。

  :

4.FIFO队列

   1.定义一个FIFO队列

  //突出显示的blockvar foo= bar2.向队列中添加元素

  公开无效要约(E val) {

  NodeE node=新节点(val);

  if (head==null){

  头=尾=节点;

  }否则{

  //链表的尾部插入

  tail.next=node

  尾=节点;

  }

  尺寸;

  }3.来自当前团队领导的一个元素

  公共电子投票(){

  if (isEmpty()){

  引发新的NoSuchElementException(队列为空!无法投票!);

  }

  //标头删除

  E val=head.val

  NodeE节点=头;

  head=head.next

  node.next=node=null

  尺寸-;

  返回val

  }4.检查当前队列的头元素。

  公共E peek() {

  if (isEmpty()){

  引发new NoSuchElementException(队列为空!“不能偷看!”);

  }

  返回head.val

  }

5.循环队列

   1.定义:基本上是用定长数组来实现数组。实现数组时,如果从数组头删除元素,需要频繁移动后面的元素,效率很低;对于出队和入队操作,使用两个引用,一个头和一个尾。添加元素是在数组的末尾添加的。删除元素只需要移动head引用所指向的地址(逻辑删除)。

  2.应用:操作系统的生产消费者模型,MySQL数据库的InnoDB存储引擎的重做日志。

  3.循环队列是用定长数组实现的,数组头是队列头,数组尾是队列尾。数组[head…tail]是循环队列的有效元素。

  Head总是指向循环队列的第一个元素。

  Tai总是指向循环队列中有效元素的最后一个位置。

  此时,循环队列的有效元素是7 ^ 9 ^ 1。

  当队列循环地将一个元素出队时,它只需要将头引用向后移动一个位置。

  此时,循环队列中唯一有效的元素是9和1。

  另一个元素在排队,但是head引用此时已经到了末尾。所谓循环队列,就是当头或尾引用到达数组末尾时,回移就是返回数组头部的操作。循环队列最大的优点是删除元素时不需要移动数据。当新元素被添加到队列中时,原始元素将被覆盖,因此只需要用新元素覆盖尾部索引位置,然后让tail移回。

  流通中应注意的要点。

  1.因此,当头尾相等时,无法判断此时循环队列是满的还是空的,所以在循环队列中,如果(tail 1)% n==head,则认为循环队列已满。

  此时循环队列已满,循环队列中会浪费一个空间来判断队列是否已满。

  2.2 .头尾的运动不可能是简单的1。使用模运算,取数组的长度。

  tail=(tail 1) % n

  head=(head 1) % n

  模数组长度的本质:

  当head和tai到达数组的最后一个索引位置时,下一次它们返回数组的头部时,它们必须将数组长度取1对的模。

  3.当3.head==tail时,队列被认为是空的。

  :

6.循环队列的操作

   1.定义一个循环队列

  //循环队列公共类循环队列实现基于整形的队列整数{

  //固定长度数组

  私有整数[]数据;

  //指向队列元素的头部

  int head

  //指向队列末尾元素的下一个元素

  int tail

  公共循环队列(整数大小){

  数据=新整数[大小1];

  }}2.向循环队列中添加一个元素

  @覆盖公共无效报价(整数值){

  if (isFull()){

  抛出新的ArrayIndexOutOfBoundsException(循环队列已满!不能提供);

  }

  data[tail]=val;

  tail=(tail 1)%数据。长度;

  }3.从循环队列中出队一个元素

  @覆盖公共整数轮询(){

  if (isEmpty()){

  引发新的NoSuchElementException(循环队列为空!无法投票!);

  }

  整数val=data[head];

  head=(head 1)%数据。长度;

  返回英国压力单位

  }4.查看当前循环队列队首元素

  @Override public Integer peek() {

  if (isEmpty()){

  引发新的NoSuchElementException(循环队列为空!"不能偷看!");

  }

  返回数据[头];

  }5.判断当前循环队列是否为空

  @ Override public boolean isEmpty(){

  返回头==尾

  }6.判断当前循环队列是否已满

  public boolean isFull(){

  返回(尾1)%数据。长度==头;

  7.toString方法

  公共字符串toString(){

  StringBuilder sb=new StringBuilder();

  某人(somebody的简写)append( front[);

  //最后一个有效元素的索引

  int lsatIndex=tail==0?数据。长度-1:尾部-1;

  for(int I=head;我!=尾巴;) {

  某人(somebody的简写)append(data[I]);

  如果(我!=lsatIndex){

  某人(somebody的简写)追加(,);

  }

  I=(I ^ 1)%数据。长度;

  }

  某人(somebody的简写)append(]tail );

  归还某人。tostring();

  }

7.双端队列

   双端队列:德克是长队的子接口,这个队列既可以尾插,头出;也可以头插,尾出

  双端队列的一个常用子类就是链接列表,不管使用栈还是队列,都可以统一使用双端队列接口

  1.现在需要一个栈

  2.现在需要一个队列

  推荐学习: 《java视频教程》 以上就是一文带你认识爪哇栈和队列的详细内容,更多请关注我们其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • mysql复合索引和组合索引,mysql组合索引数据结构
  • mysql复合索引和组合索引,mysql组合索引数据结构,Mysql之组合索引方法详解
  • mysql复合索引和组合索引,mysql复合索引数据结构
  • mysql复合索引和组合索引,mysql复合索引数据结构,MySQL的复合索引总结
  • b+树 多路搜索树,数据结构中树的分类
  • b+树 多路搜索树,数据结构中树的分类,数据结构-树(三):多路搜索树B树、B+树
  • avl树的构造,avl树特性,数据结构之AVL树详解
  • 数据结构c语言哈夫曼树,c语言哈夫曼树的构造,使用C语言详解霍夫曼树数据结构
  • c语言数据结构算法编程库,数据结构 c语言中文网
  • c语言数据结构算法编程库,数据结构 c语言中文网,C语言编程数据结构基础详解小白篇
  • c++纸牌游戏,数据结构纸牌游戏c语言
  • c++纸牌游戏,数据结构纸牌游戏c语言,C语言实战之纸牌游戏
  • ,,c#解析jobject的数据结构
  • ,,javascript数据结构之多叉树经典操作示例【创建、添加、遍历、移除等】
  • ,,Java 数据结构与算法系列精讲之背包问题
  • 留言与评论(共有 条评论)
       
    验证码: