數據結構6 隊列
上一篇講了棧,這一篇要講的是我們常用的隊列,我會從以下幾個方面進行總結。
1、什麽是隊列
2、隊列的存儲結構
3、隊列的常用操作及實現代碼
1、什麽是隊列
(1)首先,隊列也是一種特殊的線性表,它是一種操作受限的線性表。只允許在表的一端進行元素插入,而在另一端進行元素刪除。允許插入的一端稱為隊尾,允許刪除的一端稱為隊頭。
(2)隊列與現實生活中的排隊類似(如下圖),新加入的成員總是在隊尾,而排在隊列最前面的總是最先離開隊列,即先進先出 First In First Out (FIFO),因此隊列就是先進先出線性表。
(3)線性表分為順序表和鏈表,所以隊列也分為順序隊列和鏈式隊列,
2、隊列的存儲結構
用java語言自己封裝一個順序隊列:
SeqQueue.java
/** * 封裝一個順序隊列 */ public class SeqQueue { // 保存數據 public Object[] data; // 頭指針 public int head; // 尾指針 public int rear; // 隊列的最大容量 public int maxSize; public SeqQueue(int maxSize) {this.maxSize = maxSize; data = new Object[maxSize]; } }
3、隊列的常用操作及實現代碼
3-1、初始化隊列
思路:構造一個空隊列,並將頭指針head和尾指針rear都設置為0。
代碼:SeqQueueOperate.java
/** * 封裝隊列的常見操作 */ public class SeqQueueOperate { /** * 初始化 * * @param maxSize * @return */ publicSeqQueue init(int maxSize) { SeqQueue queue = new SeqQueue(maxSize); queue.head = 0; queue.rear = 0; return queue; } }
3-2、入隊
思路:若隊列沒有滿,則將數據插入到尾指針rear指向的位置,然後再將rear加1。
代碼:在 SeqQueueOperate.java 中添加方法
/** * 入隊 */ public void enter(SeqQueue queue, Object obj) { // 判斷隊列是否已經滿了 if (queue.rear >= queue.maxSize) { return; } queue.data[queue.rear] = obj; queue.rear++; }
3-3、出隊
思路:若隊列不為空,則將頭指針指向的元素刪除,然後將頭指針加1。
代碼:在 SeqQueueOperate.java 中添加方法
/** * 出隊 */ public Object dequeue(SeqQueue queue) { // 判斷隊列是否為空 if (queue.head == queue.rear) { return null; } Object obj = queue.data[queue.head]; queue.data[queue.head] = null; queue.head++; return obj; }
3-4、取隊頭
思路:若隊列不為空,則返回隊頭元素。
代碼:在 SeqQueueOperate.java 中添加方法
/** * 取隊頭 */ public Object getHead(SeqQueue queue) { // 判斷隊列是否為空 if (queue.head == queue.rear) { return null; } Object obj = queue.data[queue.head]; return obj; }
3-5、取隊長
思路:即尾指針 - 頭指針的值。
代碼:在 SeqQueueOperate.java 中添加方法
/** * 取隊長 */ public int getLength(SeqQueue queue) { return queue.rear - queue.head; }
3-6、判隊空
思路:只需要判斷頭指針和尾指針是否相等即可
代碼:在 SeqQueueOperate.java 中添加方法
/** * 判斷隊列是否為空 */ public boolean isEmpty(SeqQueue queue) { return queue.head == queue.rear; }
3-7、判隊滿
思路:只需判斷尾指針與maxSize是否相等即可
代碼:在 SeqQueueOperate.java 中添加方法
/** * 判斷隊列是否已經滿了 */ public boolean isFull(SeqQueue queue) { return queue.rear >= queue.maxSize; }
4、測試
添加一個用來測試的類
QueueTest.java
/** * 用來測試 */ public class QueueTest { public static void main(String[] args) { SeqQueueOperate seqQueueOperate = new SeqQueueOperate(); // 最大容量設置為5 int maxSize = 5; SeqQueue queue = seqQueueOperate.init(maxSize); System.out.println("隊列的最大容量是:" + maxSize); // 當前隊列的長度 System.out.println("當前隊列的長度是:" + seqQueueOperate.getLength(queue)); System.out.println(""); System.out.println("===========入隊start ==========="); System.out.println("插入6個元素試試"); seqQueueOperate.enter(queue, 1); seqQueueOperate.enter(queue, 2); seqQueueOperate.enter(queue, 3); seqQueueOperate.enter(queue, 4); seqQueueOperate.enter(queue, 5); seqQueueOperate.enter(queue, 6); System.out.println("===========入隊end ============="); // 當前隊列的長度 System.out.println("當前隊列的長度是:" + seqQueueOperate.getLength(queue)); System.out.println(""); // 出隊 System.out.println("===========出隊start ==========="); Object obj = seqQueueOperate.dequeue(queue); System.out.println("出隊的元素是:" + obj); System.out.println("===========出隊end ============="); // 當前隊列的長度 System.out.println("當前隊列的長度是:" + seqQueueOperate.getLength(queue)); System.out.println(""); System.out.println("------------------------------------"); System.out.println("隊頭元素是:" + queue.data[queue.head]); System.out.println("隊尾元素是:" + queue.data[queue.rear-1]); } }
測試結果:
註意:在一個非空的隊列中,頭指針始終指向隊頭元素,而尾指針始終指向隊尾元素的下一個位置。
歡迎轉載,但請保留文章原始出處
本文地址:http://www.cnblogs.com/nnngu/p/8277506.html
數據結構6 隊列