栈:LIFO(后进先出)

队列:FIFO(先进先出)

栈的顺序存储结构实现:

/*** 基于数组实现的顺序栈* @param <E>*/
public class Stack<E> {private Object[] data = null;private int maxSize=0;   //栈容量private int top =-1;  //栈顶指针/*** 构造函数:根据给定的size初始化栈*/Stack(){this(10);   //默认栈大小为10
    }Stack(int initialSize){if(initialSize >=0){this.maxSize = initialSize;data = new Object[initialSize];top = -1;}else{throw new RuntimeException("初始化大小不能小于0:" + initialSize);}}//判空public boolean empty(){return top==-1 ? true : false;}//进栈,第一个元素top=0;public boolean push(E e){if(top == maxSize -1){throw new RuntimeException("栈已满,无法将元素入栈!");}else{data[++top]=e;return true;}    }//查看栈顶元素但不移除public E peek(){if(top == -1){throw new RuntimeException("栈为空!");}else{return (E)data[top];}}//弹出栈顶元素public E pop(){if(top == -1){throw new RuntimeException("栈为空!");}else{return (E)data[top--];}}//返回对象在堆栈中的位置,以 1 为基数public int search(E e){int i=top;while(top != -1){if(peek() != e){top --;}else{break;}}int result = top+1;top = i;return result;      }
}

栈的链式存储结构实现:

public class LinkStack<E> {//链栈的节点private class Node<E>{E e;Node<E> next;public Node(){}public Node(E e, Node next){this.e = e;this.next = next;}}private Node<E> top;   //栈顶元素private int size;  //当前栈大小public LinkStack(){top = null;}//当前栈大小public int length(){return size;}//判空public boolean empty(){return size==0;}//入栈:让top指向新创建的元素,新元素的next引用指向原来的栈顶元素public boolean push(E e){top = new Node(e,top);size ++;return true;}//查看栈顶元素但不删除public Node<E> peek(){if(empty()){throw new RuntimeException("空栈异常!");}else{return top;}}//出栈public Node<E> pop(){if(empty()){throw new RuntimeException("空栈异常!");}else{Node<E> value = top; //得到栈顶元素top = top.next; //让top引用指向原栈顶元素的下一个元素 value.next = null;  //释放原栈顶元素的next引用size --;return value;}}
}

基于LinkedList实现的栈结构:

import java.util.LinkedList;/*** 基于LinkedList实现栈* 在LinkedList实力中只选择部分基于栈实现的接口*/
public class StackList<E> {private LinkedList<E> ll = new LinkedList<E>();//入栈public void push(E e){ll.addFirst(e);}//查看栈顶元素但不移除public E peek(){return ll.getFirst();}//出栈public E pop(){return ll.removeFirst();}//判空public boolean empty(){return ll.isEmpty();}//打印栈元素public String toString(){return ll.toString();}
}

队列的顺序存储结构实现

public class Queue<E> {private Object[] data=null;private int maxSize; //队列容量private int front;  //队列头,允许删除private int rear;   //队列尾,允许插入//构造函数public Queue(){this(10);}public Queue(int initialSize){if(initialSize >=0){this.maxSize = initialSize;data = new Object[initialSize];front = rear =0;}else{throw new RuntimeException("初始化大小不能小于0:" + initialSize);}}//判空public boolean empty(){return rear==front?true:false;}//插入public boolean add(E e){if(rear== maxSize){throw new RuntimeException("队列已满,无法插入新的元素!");}else{data[rear++]=e;return true;}}//返回队首元素,但不删除public E peek(){if(empty()){throw new RuntimeException("空队列异常!");}else{return (E) data[front];}    }//出队public E poll(){if(empty()){throw new RuntimeException("空队列异常!");}else{E value = (E) data[front];  //保留队列的front端的元素的值data[front++] = null;     //释放队列的front端的元素                return value;}            }//队列长度public int length(){return rear-front;}
}

循环队列的顺序存储结构实现

import java.util.Arrays;public class LoopQueue<E> {public Object[] data = null;private int maxSize; // 队列容量private int rear;// 队列尾,允许插入private int front;// 队列头,允许删除private int size=0; //队列当前长度public LoopQueue() {this(10);}public LoopQueue(int initialSize) {if (initialSize >= 0) {this.maxSize = initialSize;data = new Object[initialSize];front = rear = 0;} else {throw new RuntimeException("初始化大小不能小于0:" + initialSize);}}// 判空public boolean empty() {return size == 0;}// 插入public boolean add(E e) {if (size == maxSize) {throw new RuntimeException("队列已满,无法插入新的元素!");} else {data[rear] = e;rear = (rear + 1)%maxSize;size ++;return true;}}// 返回队首元素,但不删除public E peek() {if (empty()) {throw new RuntimeException("空队列异常!");} else {return (E) data[front];}}// 出队public E poll() {if (empty()) {throw new RuntimeException("空队列异常!");} else {E value = (E) data[front]; // 保留队列的front端的元素的值data[front] = null; // 释放队列的front端的元素front = (front+1)%maxSize;  //队首指针加1size--;return value;}}// 队列长度public int length() {return size;}//清空循环队列public void clear(){Arrays.fill(data, null);size = 0;front = 0;rear = 0;}
}

队列的链式存储结构实现

public class LinkQueue<E> {// 链栈的节点private class Node<E> {E e;Node<E> next;public Node() {}public Node(E e, Node next) {this.e = e;this.next = next;}}private Node front;// 队列头,允许删除  private Node rear;// 队列尾,允许插入  private int size; //队列当前长度 public LinkQueue() {front = null;rear = null;}//判空public boolean empty(){return size==0;}//插入public boolean add(E e){if(empty()){    //如果队列为空front = new Node(e,null);//只有一个节点,front、rear都指向该节点rear = front;}else{Node<E> newNode = new Node<E>(e, null);rear.next = newNode; //让尾节点的next指向新增的节点rear = newNode; //以新节点作为新的尾节点
          }size ++;return true;}//返回队首元素,但不删除public Node<E> peek(){if(empty()){throw new RuntimeException("空队列异常!");}else{return front;}}//出队public Node<E> poll(){if(empty()){throw new RuntimeException("空队列异常!");}else{Node<E> value = front; //得到队列头元素front = front.next;//让front引用指向原队列头元素的下一个元素value.next = null; //释放原队列头元素的next引用size --;return value;}        }//队列长度public int length(){return size;}
}

基于LinkedList实现队列结构

/*** 使用java.util.Queue接口,其底层关联到一个LinkedList(双端队列)实例.*/
import java.util.LinkedList;
import java.util.Queue;public class QueueList<E> {private Queue<E> queue = new LinkedList<E>();// 将指定的元素插入此队列(如果立即可行且不会违反容量限制),在成功时返回 true,//如果当前没有可用的空间,则抛出 IllegalStateException。public boolean add(E e){return queue.add(e);}//获取,但是不移除此队列的头。public E element(){return queue.element();}//将指定的元素插入此队列(如果立即可行且不会违反容量限制),当使用有容量限制的队列时,//此方法通常要优于 add(E),后者可能无法插入元素,而只是抛出一个异常。public boolean offer(E e){return queue.offer(e);}//获取但不移除此队列的头;如果此队列为空,则返回 nullpublic E peek(){return queue.peek();}//获取并移除此队列的头,如果此队列为空,则返回 nullpublic E poll(){return queue.poll();}//获取并移除此队列的头public E remove(){return queue.remove();}//判空public boolean empty() {return queue.isEmpty();}
}

转载于:https://www.cnblogs.com/CherishFX/p/4608880.html

Java实现栈和队列相关推荐

  1. Java中栈和队列的用法 Stack And Queue

    Java中栈和队列的用法 栈的实现 使用Java的集合类Stack boolean isEmpty();//判断当前栈是否为空,等价于empty(); synchronized E peek();// ...

  2. Java 用栈实现队列

    栈是先入后出,队列是先入先出.根据这个思想,可以用一个栈作为入队,另一个栈作为出队.只要把第一个栈的栈顶的元素压入第二个栈就好了,出队的时候输出第二个栈的栈顶,如果第二个栈的空了就需要不断操作从第一个 ...

  3. Java实现 栈 和 队列

    JAVA面试题编程题: 请用JAVA实现两个类,分别实现堆栈(Stack)和队列(Queue)操作 package com.lcx.interview;import java.util.ArrayLi ...

  4. 【LeetCode笔记】232. 用栈实现队列(Java、栈、队列)

    题目描述 经典题了,貌似现在面试也有点喜欢问,今天补补题! 要实现均摊时间复杂度O(1)噢 思路 & 代码 用两个栈来实现:输出栈 & 输入栈 输出栈 out:负责 pop.peek ...

  5. java 头尾 队列_源码|jdk源码之栈、队列及ArrayDeque分析

    栈.队列.双端队列都是非常经典的数据结构.和链表.数组不同,这三种数据结构的抽象层次更高.它只描述了数据结构有哪些行为,而并不关心数据结构内部用何种思路.方式去组织. 本篇博文重点关注这三种数据结构在 ...

  6. java栈编程题_Java实现栈和队列面试题

    面试的时候,栈和队列经常会成对出现来考察.本文包含栈和队列的如下考试内容: (1)栈的创建 (2)队列的创建 (3)两个栈实现一个队列 (4)两个队列实现一个栈 (5)设计含最小函数min()的栈,要 ...

  7. Java数据结构与算法(第四章栈和队列)

    2019独角兽企业重金招聘Python工程师标准>>> 本章涉及的三种数据存储类型:栈.队列和优先级队列. 不同类型的结构 程序员的工具 数组是已经介绍过的数据存储结构,和其他结构( ...

  8. 【Java实现】栈和队列就是这么简单

    一.前言 上一篇已经讲过了链表[Java实现单向链表]了,它跟数组都是线性结构的基础,本文主要讲解线性结构的应用:栈和队列 如果写错的地方希望大家能够多多体谅并指正哦,如果有更好的理解的方式也希望能够 ...

  9. 《LeetCode力扣练习》剑指 Offer 09. 用两个栈实现队列 Java

    <LeetCode力扣练习>剑指 Offer 09. 用两个栈实现队列 Java 一.资源 题目: 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 de ...

  10. char栈java,Java数据结构与算法-栈和队列(示例代码)

    (摘录加总结)------ 栈和队列不属于基础的数据结构,它们都属于线性表. 一.栈 对于栈存储操作元素只能在栈结构的一端进行元素的插入和删除,是一种性质上的线性表结构.按照"先进后出&qu ...

最新文章

  1. Face++印奇:从无人问津到融资4.6亿美金|纪录影片
  2. Beaker:一个基于Electron的点对点Web浏览器
  3. 零起点学算法 3个数比较大小
  4. linux性能分析工具集(图示)
  5. mysql数据迁移到teradata_TERADATA数据库中SELECT的使用
  6. 计算机专业考研不想走编程,考研的这些弯路,不要走,好吗?
  7. PHPStorm 调式JS /同时调式PHP和jS
  8. 基于Snap软件将2A哨兵数据转换为ENVI格式
  9. 【转载】MSDN上发现了一篇很好的WCF入门教程
  10. 国务院印发《政务信息资源共享管理暂行办法》
  11. python - 搜狗词库 (.scel 文件转 txt)
  12. Filter中获取传递参数(解决post请求参数问题)
  13. MySQL报错:The server quit without updating PID file 我的解决思路和方法
  14. 华硕无线路由打印机服务器,华硕RT-AC86U路由器怎么共享打印机
  15. 家庭备忘记事便签软件哪个实用?
  16. python中的list 冒号用法
  17. c语言编译器a安卓,c语言编译器手机版下载-c语言编译器appv7.1 安卓版 - 极光下载站...
  18. springCloud与它的好兄弟微服务
  19. elasticsearch: 查询过滤某个字段值的长度
  20. ChatGPT数据集之谜

热门文章

  1. 全网首发:gstreamer如何接入RTSP流(IP摄像头)的代码范例
  2. 如何正确获取安卓外置SD卡的路径
  3. 对象复制语意学(Object Copy Semantics)
  4. php个人资料表单显示,php-如何显示用户从表单构建器中选择的带...
  5. sybase 事务 超时返回_分布式事务设计与实践-消息最终一致性
  6. 如何用python编写操作系统_操作系统介绍、python基础
  7. yolov4训练自己的数据 灰度图像_还在为图像训练数据少发愁吗?那是因为你还不会这几招...
  8. css带三角形的对话框
  9. ubuntu 修改ip后,老ip仍然存在的问题
  10. 微软披露三个 0day 漏洞 分别影响 Word、IE 和 Office