队列是一种线性数据结构,是一种运算受限的线性表,只允许在队尾插入,在队头删除。运算规则是先进先出。恰好和栈相反。栈是先进后出。因为栈只在栈顶做删除和插入。

队列按照存储结构可以分为顺序队列和链式队列。顺序队列采用数组实现,链式队列采用节点的方式实现。

//顺序队列

 package queue;
//1.队列是一种运算受限的线性表,运算规则是先进先出。只能在队头和队尾进行操作
//2.队列由数据域,队头,队尾组成
//3.队列在队尾进行插入操作,在队头进行删除操作
public class Queue<E> {
private Object[] data = null; //数据域
private int front = 0; //队头,允许删除
private int rear = 0; //队尾,允许插入
private int maxSize = 0; //队列容量 //初始化队列
public Queue(){
this(10);
} public Queue(int initialSize) {
if(initialSize >= 0){
this.data = new Object[initialSize]; //初始化数据域
this.maxSize = initialSize;
}else {
throw new RuntimeException("初始化大小不能小于0:" + initialSize);
}
} //判断队列是否为空
public boolean isEmpty(){
return this.front == this.rear; //如果队头队尾相等说明为空
} //判断队列是否已满
public boolean isMaxSize(){
return this.rear == this.maxSize ? true : false; //如果队尾指针大于最大容量,说明队列已经满了
} //入队,从队尾插入,从队头删除
public boolean push(E e){
//判断队列是否已满
if(this.isMaxSize()){
System.err.println("队列已满,无法插入");
return false;
}
data[rear] = e; //将元素插入到队尾 data[0] = 插入值
rear++ ; //更新队尾指针
return true;
} //弹出队列
@SuppressWarnings("unchecked")
public E pop(){
//判断是否为空,为空将无法出队
if(isEmpty()){
System.err.println("队列为空,无法插入");
return null;
}
//在队头弹出
E e = (E) data[front]; //对头引用
data[front] = null; //将弹出的对头内存销毁
front ++; //更新队头指针为后面的一位元素
return e;
} //返回队首元素,但不删除
@SuppressWarnings("unchecked")
public E peek(){
if(isEmpty()){
System.err.println("队列为空");
return null;
} return (E) this.data[front];
} //遍历队列
public void display(){
while(front < rear){
System.out.println(data[front]);
front ++;
}
} //返回队列实际长度
public int getSize(){
return this.data.length;
} public static void main(String args[]){
Queue<Integer> queue = new Queue<Integer>();
int i = 0;
while(i < 10){
queue.push(i);
i ++;
}
// queue.pop();
queue.display();
} }

//链式队列

 package queue;

 //链式队列,由队头和队尾节点组成,节点中包含数据域和指针域
public class LinkedQueue<E> {
//1.定义队列结构
//节点类
@SuppressWarnings("hiding")
private class Node<E>{
public E data = null; //数据域
public Node<E> next = null; //指针域 //构造方法
@SuppressWarnings("unused")
public Node(){} public Node(E data, Node<E> next){
this.data = data;
this.next = next;
} }/*Node*/ private Node<E> front = null; //队头
private Node<E> rear = null; //队尾
private int size = 0; //队列长度 //2.判断队列是否为空
public boolean isEmpty(){
return size == 0;
} //3.入队
public boolean push(E e){
Node<E> node = new Node<E>(e, null);
//队列为空的情况下
if(isEmpty()){
this.rear = node; //尾节点赋值为新插入的节点
this.front = this.rear; //在只有一个节点的情况下,头尾节点相等
size++;
return true;
}
//不为空的情况下
this.rear.next = node; //尾节点指向新节点
this.rear = node; //更新尾节点
size ++; //队列节点数+1
return true;
} //4.出队
public E pop(){
//判断队列是否为空
if(isEmpty()){
System.err.println("队列为空");
return null;
}
//弹出队头,更新队头指针
Node<E> temp = this.front; //获取队头引用
this.front = this.front.next; //更新队头指针
temp.next = null; //释放原队头节点引用
return temp.data; } //5.返回队头但不删除
public E peek(){
//判断是否为空
if(isEmpty()){
System.err.println("为空,不能返回");
return null;
}
return this.front.data;
} //6.求长
public int getSize(){
return this.size;
} //7.打印队列
public void display(){
for (int i = 0; i < this.size; i++) {
if(this.front == null){
return;
}
System.out.println(this.front.data);
this.front = this.front.next;
}
} public static void main(String args[]){
LinkedQueue<Integer> queue = new LinkedQueue<Integer>();
//1.入队
int i = 0;
while(i < 10){
queue.push(i);
i++;
} //出队
int j = 0;
while(j < 8){
System.out.println(queue.pop());
j ++;
} // queue.display(); } }

队列java实现的更多相关文章

  1. java中使用队列:java.util.Queue (转)

    Queue接口与List.Set同一级别,都是继承了Collection接口.LinkedList实现了Queue接 口.Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类 ...

  2. 队列-java代码

    public class QueueDemo { private int maxSize; private long[] queueArray; // 队列的头,实际是数组的尾 private int ...

  3. java中使用队列:java.util.Queue

    在java5中新添加了java.util.Queue接口,用以支持队列的常见操作.该接口扩展了java.util.Collection接口.Queue使用时要尽量避免Collection的add()和 ...

  4. 阻塞队列 - java基于链表的简单实现

    1.阻塞队列的原理 阻塞队列与普通队列的区别在于:阻塞队列为空时,从队列中获取元素的操作将会被阻塞,当队列为满时,往队列里添加元素的操作会被阻塞. 试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其 ...

  5. 剑指offer【05】- 用两个栈实现队列(java)

    题目:用两个栈实现队列 考点:栈和队列 题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路:每次psuh是时先将stack2清空放入stck1(保 ...

  6. java中使用队列:java.util.Queue(转)

    队列是一种特殊的线性表,是运算受到限制的一种线性表,只允许在表的一端进行插入,而在另一端进行删除元素的线性表.队尾(rear)是允许插入的一端.队头(front)是允许删除的一端.空队列是不含元素的空 ...

  7. 网站架构:消息队列 Java后端架构

    2017-01-13  一.消息队列概述 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题.实现高性能,高可用,可伸缩和最终一致性架构.是大型分布式系统不可缺少的中间 ...

  8. redis实现消息队列-java代码实现

    转:https://blog.csdn.net/qq_42175986/article/details/88576849 pom.xml <!-- redis依赖 --> <depe ...

  9. 05.用两个栈实现队列 Java

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路 进栈: 直接进stack1 出栈: 若stack2不为空,则出栈. 否则,当stack1不为空时, ...

  10. (超详细)动手编写 — 栈、队列 ( Java实现 )

    目录 前言 栈 概念 栈的设计 编码实现 小结 队列 概念 队列的设计 编码实现 双端队列 概念 设计 编码 循环队列 循环队列 循环双端队列 声明 前言 栈 概念 什么是栈? **栈 **:是一种特 ...

随机推荐

  1. Python之subprocess模块、sys模块

    一.subprocess模块 # import os # os.system('tasklist') #类似cmd输入系统命令 ''' subprocess的目的就是启动一个新的进程并且与之通信. s ...

  2. springmvc框架开发中解决产生的乱码情况

    一:解决post请求方式产生的乱码情况 示例代码如下: <!-- 解决post乱码 --> <filter> <filter-name>CharacterEncod ...

  3. Spring学习(十六)----- Spring AOP实例(Pointcut(切点),Advisor)

    在上一个Spring AOP通知的例子,一个类的整个方法被自动拦截.但在大多数情况下,可能只需要一种方式来拦截一个或两个方法,这就是为什么引入'切入点'的原因.它允许你通过它的方法名来拦截方法.另外, ...

  4. Winform下的语言国际化,几行代码轻松实现

    最近做了一些关于winform的项目,需要用到winform的语言国际化,在初使化的时候用起来非常方便.可以参考一下: 核心逻辑: 预览效果演示: OK,以下是核心代码和操作流程 一,添加Langua ...

  5. 《杜增强讲Unity之Tanks坦克大战》6-发射子弹

    6 发射子弹 本节完成发射子弹的功能,最终代码如下:   image 首先,发射子弹得确定发射的位置和方向,还有发射的初始速度.具体的发射速度和按下发射按键的时间长短有关,这个关于子弹的蓄力我们在第九 ...

  6. Mysql启动失败解决方案 - 个人经验可能不适合所有场景

    以前一直用的Mysql5.5,安装程序是一个exe程序,安装完了相应的服务也给我注册好了,然后直接启动连接即可. 最近升级到了8.0.15,发现和以前不一样了. 8.0.15下载地址 安装解压之后目录 ...

  7. 腾讯hr面

    腾讯hr面面经 20181018 寒暄几句 hr自我介绍 hr介绍面试和最后出结果的时间周期 进入主题 自我介绍 考研成绩专业第一 聊考研(考研的经过.考研和保研) 本科成绩 考研成绩超长发挥还是正常 ...

  8. linux下实现压测-html报表生成-控制台参数优化【jmeter】

    jmeter - 单机压测 - 命令行模式-html报表生成-控制台参数优化 一/ 准备工作 1.压力机安装并配置好 jdk 2.调试好程序脚本 再上传到 linux下 3.进入jmeter  bin ...

  9. 基于Eclipse下的python图像识别菜鸟版(利用pytesseract以及tesseract)

    这是我注册博客后写的第一篇博客,希望对有相关问题的朋友有帮助. 在图像识别前,首先我们要做好准备工作. 运行环境:windows7及以上版本 运行所需软件:(有基础的可以跳过这一段)eclipse,p ...

  10. spring-boot rabbitMq 完整项目搭建,包括创建、发送、监听

    写在开始 rabbitMq 代码按照三部分介绍 第一部分 交换机和队列的创建 第二部分 消息发送 第三部分 消息监听 第一部分 1 建立queue 2 建立exchange 3 exchange绑定q ...