1. 程式人生 > >基於連結串列、陣列實現佇列、迴圈佇列

基於連結串列、陣列實現佇列、迴圈佇列

佇列是一種先進先出的資料結構,它和棧的性質正好相反,但是兩者卻經常結合在一起實現一些特殊的操作。

1.佇列的介面

public interface QueueADT {
	//入隊
	public void enqueue(Object element);
	//出隊
	public Object dequeue();
	//返回隊首元素
	public Object first();
	//是否為空
	public boolean isEmpty();
	//返回佇列大小
	public int size();
	
	public String toString();
}

2.連結串列實現佇列
public class LinkedQueue implements QueueADT {
	
	// 連結串列節點類,內部類實現,包含資料域和指標域
	class Node {
		int data; // 資料域
		Node next;// 指標域

		public Node(int data) {
			this.data = data;
		}
	} 
	//指向隊首、隊尾節點
	private Node front,rear;
	//維護佇列的大小
	private int count;
	
	public LinkedQueue() {
		front=null;
		rear=null;
		count=0;
	}
	//保證出棧或者出佇列的是頭結點,這樣才能完成更新,所以對於棧的入棧操作,是從尾節點開始構造的
	//佇列的入隊操作,是從頭結點開始構造的
	@Override
	public void enqueue(Object element) {
		Node node=new Node((Integer)element);
		if(isEmpty()){
			front=rear=node;
		}else{
			rear.next=node;
			rear=node;
		}
		count++;
	}
	
	@Override
	public Object dequeue() {
		if(isEmpty()){
            System.out.println("佇列中沒有元素");
            System.exit(1);
        }
		Object result=front.data;
		front=front.next;
		count--;
		return result;
	}

	@Override
	public Object first() {
		return front.data;
	}

	@Override
	public boolean isEmpty() {
		return (size()==0);
	}

	@Override
	public int size() {
		return count;
	}
	
	public static void main(String[] args) {
        
        LinkedQueue queue = new LinkedQueue();
        
        System.out.println("依次將0到9入隊,然後連續出隊5次");
        for(int i = 0;i < 10;i++)
            queue.enqueue(i);
        for(int i = 0;i < 5;i++)
            queue.dequeue();
        System.out.println("佇列的大小為: " + queue.size());
        System.out.println("佇列為空嗎?: " + queue.isEmpty());
        System.out.println("佇列的頭為: " + queue.first());

    }

}
3.陣列實現佇列
//用陣列實現佇列,如果隊首不固定,隨著出隊操作,陣列前面的空間就被浪費,但是如果隊首固定,每次出隊都要移動所有元素
public class ArrayQueue implements QueueADT {
	
	private Object[] contents;
	//由於陣列實現,rear是一個整數指標,指向陣列的索引即可
	private int rear;
	private static int SIZE = 10;
	
	public ArrayQueue(){
        contents = new Object[SIZE];
        rear = 0;
    }
	
	public void expand(){
        Object[] larger = new Object[size()*2];
        for(int index = 0;index < rear;index++)
            larger[index] = contents[index];
        
        contents = larger;
    }
	
	@Override
	public void enqueue(Object element) {
		if(rear == contents.length)
            expand();
        contents[rear] = element;
        rear++;
	}

	@Override
	public Object dequeue() {
		if(isEmpty()){
            System.out.println("佇列為空");
            System.exit(1);
        }
        Object result = contents[0];
        //為了保證隊首固定,每次出隊之後都要移動元素
        for(int index = 0;index < rear;index++)
                contents[index] = contents[index+1];
        rear--;
        return result;        
	}

	@Override
	public Object first() {
		return contents[0];
	}

	@Override
	public boolean isEmpty() {
		return (size()==0);
	}

	@Override
	public int size() {
		return rear;
	}

}

4.陣列實現迴圈佇列 
//使用迴圈佇列可以消除元素頻繁移動帶來的效率問題,用兩個指標分別指向隊首和隊尾,走到陣列末尾時,在陣列頭部繼續入隊
public class CircularArrayQueue implements QueueADT{
	
	private Object[] contents;
    private int front,rear;//front為隊頭下標,rear為隊尾的下一個元素的下標
    private int count;//標記佇列元素個數
    private static int SIZE = 10;
    
    
    public CircularArrayQueue(){
        contents = new Object[SIZE];
        front = -1;
        rear = 0;
        count = 0;
    }
	//對棧還有佇列進行操作,或者其他類,一般都要特殊考慮一下狀態為空或者初始化時的特殊值    
	@Override
	public void enqueue(Object element) {
		if(isEmpty()){
			contents[0]=element;
			front=0;
			rear=1;
			count++;
		}else{
			contents[rear]=element;
			rear=(rear+1)%contents.length;
			count++;
		}
	}

	@Override
	public Object dequeue() {
		if(isEmpty()){
            System.out.println("佇列為空!!!");
            System.exit(1);
        }
		Object result = contents[front];
        front = (front + 1) % contents.length;
        count--;
        return result;    
	}

	@Override
	public Object first() {
		return contents[front];
	}

	@Override
	public boolean isEmpty() {
		return (size()==0);
	}

	@Override
	public int size() {
		return count;
	}

}



相關推薦

Java資料結構之——佇列:通過連結串列陣列實現

//連結串列實現佇列 class Node<E>{ Node<E> next = null; E data; public Node(E data){ this.data = data; } } public clas

UVA-12657 Boxes in a Line (模擬,雙向連結串列陣列實現))

第一次對陣列實現雙向連結串列的練習,理解了發現數組實現真方便… 題目:UVA-12657 題目描述: 你有n個盒子在桌子上的一條線上從左到右編號為1……n。你的任務是模擬四種操作 1 X Y 移動盒子編號X到盒子編號Y的左邊(如果X已經在Y的左邊了就忽略) 2 X Y 移

圖知識小結6-十字連結串列陣列實現與應用

十字連結串列是一種高效儲存稀疏圖並可以顯著提高查詢效率的一種儲存結構,解決了圖的遍歷過程中鄰接表空間消耗大而鄰接矩陣求一個點入度又需要遍歷全部表的問題,下面給出其陣列實現: //十字連結串列的陣列實現 #include <bits/stdc++.h> using namesp

每天一點點之資料結構與演算法 - 應用 - 分別用連結串列陣列實現LRU緩衝淘汰策略

一、基本概念: 1、什麼是快取? 快取是一種提高資料讀取效能的技術,在硬體設計、軟體開發中都有著非廣泛的應用,比如常見的CPU快取、資料庫快取、瀏覽器快取等等。   2、為什麼使用快取?即快取的特點 快取的大小是有限的,當快取被用滿時,哪些資料應該被清

基於連結串列的棧實現

1.建立鏈節點類link 只有一種資料int型別,和對下一個鏈節點的引用next public class Link { public int a; public Link next; public Link(int m){ a=m; }

static linked list(靜態連結串列,結合陣列實現)

一.之前已經寫過單向連結串列和雙向連結串列的指標實現,這是單向連結串列的陣列實現,也稱靜態實現,即不需要通過new和delete動態管理記憶體 總體與指標的實現相似,利用元素所在陣列中的位置作為指標next的依據 // 用節點陣列實現連結串列的各種操作 /

基於連結串列陣列實現佇列迴圈佇列

佇列是一種先進先出的資料結構,它和棧的性質正好相反,但是兩者卻經常結合在一起實現一些特殊的操作。 1.佇列的介面 public interface QueueADT { //入隊 public void enqueue(Object element); //出隊 p

基於連結串列佇列基於順序表的佇列 C語言

基於連結串列的佇列: //LinkQueue.h #pragma once #include<stdio.h> #include<stdlib.h> #include<

Leetcode88 21 合併倆個有序陣列合併倆個有序連結串列陣列連結串列

1.合併倆個有序陣列 給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為一個有序陣列。 說明: 初始化 nums1 和 nums2 的元素數量分別為 m 和 n。 你可以假設 nums1 有足夠的空間(空間大小大於或等於

Java棧(基於連結串列基於陣列實現

基於陣列實現 package com.ma.stack; /** * @author sunfch *此棧實現基於陣列,初始棧時已經設定棧大小 */ public class MyArrayStack { private int size; private int top = -1

資料結構實現 6.4:優先佇列_基於連結串列實現(C++版)

資料結構實現 6.4:優先佇列_基於連結串列實現(C++版) 1. 概念及基本框架 2. 基本操作程式實現 2.1 入隊操作 2.2 出隊操作 2.3 查詢操作 2.4 其他操作 3. 演算法複雜度分析

1連結串列陣列時間複雜度空間複雜度

1、記憶體中開闢空間:       C語言中:全域性、域、堆空間(malloc/new) 組織形式:      a、連續記憶體空間:申請一個數組,申連續記憶體      b、分散空間:申請次數無

基於陣列的容器類實現基於連結串列結構的容器類實現

1. 資料結構   概念 :資料結構是計算機儲存、組織資料的方式。    簡單理解:可以看成是對資料儲存的一種方式   儲存方式   :     1.變數       2.陣列    3.自定義容器 連結串列是一種線性的資料結構是一種最簡單的動態資料

兩種連結串列操作--連結串列反轉連結串列排序(pyhon實現)

連結串列反轉和連結串列排序是兩種連結串列的基本操作,在python裡list型別的reverse()方法就是對list的反轉,sort()方法可以對list的元素進行排序,本文將探討這兩種連結串列操作基於單鏈表的實現方式。 連結串列反轉 對於單鏈表而言,連結串列反轉可

基於連結串列佇列實現

1.建立鏈節點類link 只有一種資料int型別,和對下一個鏈節點的引用next public class Link { public int a; public Link next; public Link(int m){ a=m; }

二叉樹C++ | 連結串列遞迴實現二叉樹(插入搜尋)_1

遞迴實現二叉樹(插入、搜尋) // Binary Search Tree - Implemenation in C++ // Simple program to create a BST of integers and search an element in it #include<i

JAVA基於陣列實現集合和基於連結串列實現集合

1.定義一個介面MyListpublic interface MyList { //增 void add(int num); //刪 boolean delete(int index2); //改 boolean update(int index2, int n

基於連結串列的雙端佇列的類模板的C++實現

/* 用連結串列實現雙端佇列(儲存整型) 該佇列有以下幾個功能 1.Createdeque輸入n個元素來初始化佇列 2.cleardeque清空整個佇列 3.f_inde(T e)在隊首插入元素e

python實現棧(基於list與連結串列),佇列(基於連結串列

#!/usr/bin/env python # encoding: utf-8 ''' @author: cc ''' class Stack(): def __init__(self): self.items=[] def isEmpty

java 佇列與棧實現連結串列陣列

我們經常會問到java資料結構可以怎麼實現,看過了演算法之後得到很大啟發,這裡整理如下。 佇列是一種先進先出(FIFO)的集合模型,而棧則是後進先出(LIFO)的集合模型,我們經常使用它們用來儲存元素的相對順序。Java中在java.util.LinkedList類中實現了