浅谈Java中的数据结构(队列)

借助Java语言用数组和链表实现队列

队列 (Queue)

一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列是按照“先进先出”或“后进后出”的原则组织数据的。队列中没有元素时,称为空队列。

Part 1 用链表实现队列

QueueNode类是用来表示一个链表节点的类,QueueLinked是链表实现的队列,

其中front是对首指针,rear是队尾指针,队首出队,队尾入队。

 1 package test;
 2 /**
 3  * 链表节点类
 4  */
 5 class QueueNode {
 6     Object data; // 节点存储的数据
 7     QueueNode next; // 指向下个节点的指针
 8
 9     public QueueNode() {
10         this(null, null);
11     }
12     public QueueNode(Object data) {
13         this(data, null);
14     }
15     public QueueNode(Object data, QueueNode next) {
16         this.data = data;
17         this.next = next;
18     }
19 }
20 /**
21  * 单向链表实现的队列
22  */
23 public class Manager {
24     QueueNode front; // 队首指针
25     QueueNode rear;  // 队尾指针
26
27     public Manager() {
28         this.rear = null;
29         this.front = null;
30     }
31     /**
32      * 将一个对象追加到队列的尾部
33      */
34     public void enqueue(Object obj) {
35         //如果队列是空的
36         if (rear == null && front == null) {
37             rear = new QueueNode(obj);
38             front = rear;
39         } else {
40             QueueNode node = new QueueNode(obj);
41             rear.next = node;
42             rear = rear.next;
43         }
44     }
45     /**
46      * 队首对象出队
47      * @return 出队的对象,队列空时返回null
48      */
49     public Object dequeue() {
50         //如果队列空
51         if (front == null) {
52             return null;
53         }
54         //如果队列中只剩下一个节点
55         if (front == rear && rear != null) {
56             QueueNode node = front;
57             rear = null;
58             front = null;
59             return node.data;
60         }
61         Object obj = front.data;
62         front = front.next;
63         return obj;
64     }
65
66     public static void main(String[] args) {
67         //遍历输出
68         Manager q = new Manager();
69         q.enqueue("。");
70         q.enqueue("。。");
71         q.enqueue("。。。");
72         q.enqueue("。。。。");
73         for (int i = 0; i < 4; i++) {
74             System.out.println(q.dequeue());
75         }
76     }
77 }

Part 2 用数组实现队列

 1 package test;
 2 /**
 3  * 顺序存储结构队列
 4  */
 5 public class Manager {
 6     private static final int MAX_SIZE = 100;
 7     private Object[] queue;        //队列
 8     private int front;                     //头指针
 9     private int rear;                      //尾指针
10     private int length;                //队列初始化长度
11     //初始化队列
12     private void init(){
13         queue = new Object[this.length + 1];
14         front = rear = 0;
15     }
16     //入队
17     public void put(Object object) throws Exception{
18         if(isFull()){
19             throw new Exception("入队失败!队列已满!");
20         }
21         queue[rear] = object;
22         rear = (rear + 1) % queue.length;
23     }
24     //出队
25     public Object get() throws Exception{
26         if(isEmpey()){
27             throw new Exception("出队失败!队列为空!");
28         }
29         Object object = queue[front];
30         queue[front] = null;  //释放对象
31         front = (front + 1) % queue.length;
32         return object;
33     }
34     //清空队列
35     public void clear(){
36         queue = null;
37         queue = new Object[this.length];
38     }
39     //获得队列当前大小
40     public int size(){
41         return (rear - front + queue.length ) % queue.length;
42     }
43     //判断队列是否已满
44     public boolean isFull(){
45         return (rear + 1) % queue.length == front;
46     }
47     //判断队列是否为空
48     public boolean isEmpey(){
49         return front == rear;
50     }
51     public Manager(){
52         this.length = MAX_SIZE;
53         init();
54     }
55     public Manager(int length){
56         this.length = length;
57         init();
58     }
59
60     public static void main(String[] args) {
61         Manager queue = new Manager(5);
62         char[] data = new char[]{‘1‘,‘2‘,‘3‘,‘4‘,‘5‘};
63         try {
64             for (int i = 0; i < data.length; i++) {
65                 System.out.println("入队数据:" + data[i]);
66                 queue.put(data[i]);
67             }
68             System.out.println("队大小:" + queue.size());
69             System.out.println("---------------------");
70             while(!queue.isEmpey()){
71                 System.out.println("出队数据:" + queue.get());
72             }
73             System.out.println("队空否?\t" + queue.isEmpey());
74         }catch (Exception e) {
75             e.printStackTrace();
76         }
77     }
78 }    
时间: 2024-11-09 06:15:24

浅谈Java中的数据结构(队列)的相关文章

浅谈Java中的数据结构(概述)

所谓数据结构,即是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成. 常见的数据结构包括:数组,栈,队列,链表,树,图,堆,散列表. 数组 (Array) 在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来.这些按序排列的同类数据元素的集合称为数组.在C语言中, 数组属于构造数据类型.一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型.因此按数组元素的类型不同,数组又可分为数值数组.字符数组.指针数组.结构数组等各种类

浅谈Java中set.map.List的区别

就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型. JAVA集合主要分为三种类型: Set(集) List(列表) Map(映射) Collection 接口 :Collection是最基本的集合接口,声明了适用

浅谈Java中的Set、List、Map的区别(1)

就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型. JAVA集合主要分为三种类型: Set(集) List(列表) Map(映射) Collection 接口 :Collection是最基本的集合接口,声明了适用

浅谈Java中的hashcode方法 - 海 子

浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现. 为何Object类需要这样一个方法?它有什么作用呢?今天我们就来具体探讨一下hashCode方法. 一.hashCode方法的作用 对于包含容器类型的程

浅谈JAVA中的“hashcode()”方法

浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 为何Object类需要这样一个方法?它有什么作用呢?今天我们就来具体探讨一下hashCode方法. 根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现. 一.hashCode方法的作用 对于包含容器类型的程

【转】浅谈Java中的equals和==

浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String("hello"); 3 4 System.out.println(str1==str2); 5 System.out.println(str1.equals(str2)); 为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初

浅谈Java中的对象和引用

浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是"对象和对象引用",很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起了解一下对象和对象引用之间的区别和联系. 1.何谓对象? 在Java中有一句比较流行的话,叫做"万物皆对象",这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Java编程思想>中的一段原话: "按照通

浅谈Java中的equals和==

浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String("hello"); 3 4 System.out.println(str1==str2); 5 System.out.println(str1.equals(str2)); 为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初

浅谈Java中的对象和对象引用

浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起了解一下对象和对象引用之间的区别和联系. 1.何谓对象? 在Java中有一句比较流行的话,叫做“万物皆对象”,这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Java编程思想>中的一段原话: “按照通俗的说法,每个对象都是某个类(class)的一个实