日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java数据结构之线性表(2)

發(fā)布時(shí)間:2023/12/13 java 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java数据结构之线性表(2) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

從這里開(kāi)始將要進(jìn)行Java數(shù)據(jù)結(jié)構(gòu)的相關(guān)講解,Are you ready?Let's go~~

java中的數(shù)據(jù)結(jié)構(gòu)模型可以分為一下幾部分:

1.線性結(jié)構(gòu)

2.樹形結(jié)構(gòu)

3.圖形或者網(wǎng)狀結(jié)構(gòu)

接下來(lái)的幾張,我們將會(huì)分別講解這幾種數(shù)據(jù)結(jié)構(gòu),主要也是通過(guò)Java代碼的方式來(lái)講解相應(yīng)的數(shù)據(jù)結(jié)構(gòu)。

今天要講解的是:Java線性結(jié)構(gòu)

Java數(shù)據(jù)結(jié)構(gòu)之線性結(jié)構(gòu)

說(shuō)到線性結(jié)構(gòu)的話,我們可以根據(jù)其實(shí)現(xiàn)方式分為兩類:

1)順序結(jié)構(gòu)的線性表

2)鏈?zhǔn)浇Y(jié)構(gòu)的線性表

3)棧和隊(duì)列的線性表

對(duì)于1)和2)的講解,請(qǐng)參考下面的地址:http://www.cnblogs.com/xiohao/p/4353910.html

下面主要講解線性結(jié)構(gòu)中的棧和隊(duì)列。

? 1.線性結(jié)構(gòu)之棧的講解

??? 所謂棧是一種特殊的線性結(jié)構(gòu),它的特點(diǎn)在于只允許我們?cè)诰€性表的尾端進(jìn)行insert和remove操作。可以理解為是一種受限的

??? 線性表。往線性表中加入一個(gè)元素我們稱為入棧,從線性表中移除一個(gè)元素我們稱為出棧。實(shí)在不懂,百度一下你就知道了。

??? 在Java的jdk中的實(shí)現(xiàn)以Stack(底層繼承的是Vector類)和LinkedList(里面同樣實(shí)現(xiàn)了push,pop,peek等操作)為主,還是那句話,感興趣的

??? 自己查看源代碼即可。

??? 下面我們進(jìn)行相關(guān)模仿,

??? 首先通過(guò)數(shù)組來(lái)模仿入棧和出棧操作:

????

package com.yonyou.test;import java.util.Arrays;/*** 測(cè)試類* @author 小浩* @創(chuàng)建日期 2015-3-20*/ public class Test{ public static void main(String[] args) {SequenceStack<String> stack=new SequenceStack<String>();System.out.println("順序棧的初始化長(zhǎng)度為:"+stack.length());stack.push("Hello");stack.push("World");stack.push("天下太平");System.out.println("當(dāng)前stack中的元素為:"+stack);System.out.println("當(dāng)前stack.peek();中的元素為:"+stack.peek());System.out.println("當(dāng)前元素線性表是否為空:"+stack.empty());}}/*** 創(chuàng)建一個(gè)線性棧* 注意這個(gè)類是線程不安全的,在多線程下不要使用* @author 小浩* @創(chuàng)建日期 2015-3-20* @param <T>*/ class SequenceStack<T> {//線性棧的默認(rèn)長(zhǎng)度為10private int DEFAULT_SIZE = 10;// 保存數(shù)組的長(zhǎng)度。private int capacity;// 定義當(dāng)?shù)讓訑?shù)組容量不夠時(shí),程序每次增加的數(shù)組長(zhǎng)度private int capacityIncrement = 0;// 定義一個(gè)數(shù)組用于保存順序棧的元素private Object[] elementData;// 保存順序棧中元素的當(dāng)前個(gè)數(shù)private int size = 0;/*** 以默認(rèn)數(shù)組長(zhǎng)度創(chuàng)建空順序棧*/public SequenceStack(){capacity = DEFAULT_SIZE;elementData = new Object[capacity];}/*** 以一個(gè)初始化元素來(lái)創(chuàng)建順序棧* @param element*/public SequenceStack(T element){this();elementData[0] = element;size++;}/*** 以指定長(zhǎng)度的數(shù)組來(lái)創(chuàng)建順序棧* @param element 指定順序棧中第一個(gè)元素* @param initSize 指定順序棧底層數(shù)組的長(zhǎng)度*/public SequenceStack(T element , int initSize){this.capacity = initSize;elementData = new Object[capacity];elementData[0] = element;size++;}/*** 以指定長(zhǎng)度的數(shù)組來(lái)創(chuàng)建順序棧* @param element 指定順序棧中第一個(gè)元素* @param initSize 指定順序棧底層數(shù)組的長(zhǎng)度* @param capacityIncrement 指定當(dāng)順序棧的底層數(shù)組的長(zhǎng)度不夠時(shí),底層數(shù)組每次增加的長(zhǎng)度*/public SequenceStack(T element , int initSize, int capacityIncrement){this.capacity = initSize;this.capacityIncrement = capacityIncrement;elementData = new Object[capacity];elementData[0] = element;size++;}/*** 獲取順序棧的大小* @return*/public int length(){return size;}/*** 入棧* @param element*/public void push(T element){ensureCapacity(size + 1);elementData[size++] = element;}/*** 很麻煩,而且性能很差* @param minCapacity*/private void ensureCapacity(int minCapacity){// 如果數(shù)組的原有長(zhǎng)度小于目前所需的長(zhǎng)度if (minCapacity > capacity){if (capacityIncrement > 0){while (capacity < minCapacity){// 不斷地將capacity長(zhǎng)度加capacityIncrement,// 直到capacity大于minCapacity為止capacity += capacityIncrement;}}else{// 不斷地將capacity * 2,直到capacity大于minCapacity為止while (capacity < minCapacity){capacity <<= 1;}}elementData = Arrays.copyOf(elementData , capacity);}}/*** 出棧* @return*/@SuppressWarnings("unchecked")public T pop(){T oldValue = (T)elementData[size - 1];// 釋放棧頂元素elementData[--size] = null;return oldValue;}/*** 返回棧頂元素,但不刪除棧頂元素* @return*/@SuppressWarnings("unchecked")public T peek(){return (T)elementData[size - 1];}/*** 判斷順序棧是否為空棧* @return*/public boolean empty(){return size == 0;}/*** 清空順序棧*/public void clear(){// 將底層數(shù)組所有元素賦為nullArrays.fill(elementData , null);size = 0;}/*** 重寫toString*/public String toString(){if (size == 0){return "[]";}else{StringBuilder sb = new StringBuilder("[");for (int i = size - 1 ; i > -1 ; i-- ){sb.append(elementData[i].toString() + ", ");}int len = sb.length();return sb.delete(len - 2 , len).append("]").toString();}} }

?

?? 其次通過(guò)鏈?zhǔn)酱鎯?chǔ)來(lái)模仿入棧和出棧操作,具體內(nèi)容可以看下面的代碼:

??

package com.yonyou.test;/*** 測(cè)試類* @author 小浩* @創(chuàng)建日期 2015-3-20*/ public class Test{ public static void main(String[] args) {LinkStack<String> stack=new LinkStack<String>();System.out.println("順序棧的初始化長(zhǎng)度為:"+stack.length());stack.push("Hello");stack.push("World");stack.push("天下太平");System.out.println("當(dāng)前stack中的元素為:"+stack);System.out.println("當(dāng)前stack.peek();中的元素為:"+stack.peek());System.out.println("當(dāng)前元素線性表是否為空:"+stack.empty());}}/*** 創(chuàng)建一個(gè)鏈?zhǔn)酱鎯?chǔ)的線性棧* 注意這個(gè)類是線程不安全的,在多線程下不要使用* @author 小浩* @創(chuàng)建日期 2015-3-20* @param <T>*/ class LinkStack<T> {// 定義一個(gè)內(nèi)部類Node,Node實(shí)例代表鏈棧的節(jié)點(diǎn)。private class Node{// 保存節(jié)點(diǎn)的數(shù)據(jù)private T data;// 指向下個(gè)節(jié)點(diǎn)的引用private Node next;// 無(wú)參數(shù)的構(gòu)造器public Node(){}// 初始化全部屬性的構(gòu)造器public Node(T data , Node next){this.data = data;this.next = next;}}// 保存該鏈棧的棧頂元素private Node top;// 保存該鏈棧中已包含的節(jié)點(diǎn)數(shù)private int size;/*** 創(chuàng)建空鏈棧*/public LinkStack(){// 空鏈棧,top的值為nulltop = null;}/*** 以指定數(shù)據(jù)元素來(lái)創(chuàng)建鏈棧,該鏈棧只有一個(gè)元素* @param element*/public LinkStack(T element){top = new Node(element , null);size++;}/*** 返回鏈棧的長(zhǎng)度* @return*/public int length(){return size;}/*** 進(jìn)棧* @param element*/public void push(T element){// 讓top指向新創(chuàng)建的元素,新元素的next引用指向原來(lái)的棧頂元素top = new Node(element , top);size++;}/*** 出棧* @return*/public T pop(){Node oldTop = top;// 讓top引用指向原棧頂元素的下一個(gè)元素top = top.next;// 釋放原棧頂元素的next引用oldTop.next = null;size--;return oldTop.data;}/*** 訪問(wèn)棧頂元素,但不刪除棧頂元素* @return*/public T peek(){return top.data;}/*** 判斷鏈棧是否為空棧* @return*/public boolean empty(){return size == 0;}/*** 清空鏈棧*/public void clear(){// 將底層數(shù)組所有元素賦為nulltop = null;size = 0;}/*** 重寫toString方法*/public String toString(){// 鏈棧為空鏈棧時(shí)if (empty()){return "[]";}else{StringBuilder sb = new StringBuilder("[");for (Node current = top ; current != null; current = current.next ){sb.append(current.data.toString() + ", ");}int len = sb.length();return sb.delete(len - 2 , len).append("]").toString();}} }

?

? 2.線性結(jié)構(gòu)之隊(duì)列的講解

??? 隊(duì)列也是一種被限制過(guò)的線性結(jié)構(gòu),它使用固定的一端來(lái)插入元素(隊(duì)尾),在另一端刪除相關(guān)的元素(隊(duì)頭)。

??? 其基本特征為“先進(jìn)先出”,而棧的基本特點(diǎn)為“先進(jìn)后出”。

??? 在Java的jdk中主要的實(shí)現(xiàn)類為Dueue接口的實(shí)現(xiàn)類ArrayDeque(線性)和LinkedList(鏈?zhǔn)?,

??? 其中Dueue接口是一個(gè)雙端隊(duì)列,它繼承了隊(duì)列根接口Queue,同時(shí)Queue接口有實(shí)現(xiàn)隊(duì)列的6個(gè)根本方法

???

?拋出異常的版本不拋出異常的版本(返回null)
插入1、 boolean add(E e);?2、 boolean offer(E e);
移除3、 E remove();?4、 E poll();
訪問(wèn)5、 E element();?6、 E peek();

???

???

????如果感興趣的話,請(qǐng)查相關(guān)的源代碼。

??? 首先講解的是隊(duì)列的順序存儲(chǔ):

??? 具體內(nèi)容請(qǐng)看相關(guān)代碼:

???

package com.yonyou.test;import java.util.Arrays;/*** 測(cè)試類* @author 小浩* @創(chuàng)建日期 2015-3-20*/ public class Test{ public static void main(String[] args) {SequenceQueue<String> queue=new SequenceQueue<String>();System.out.println("隊(duì)列的初始化長(zhǎng)度為:"+queue.length());queue.add("Hello");queue.add("World");queue.add("天下太平");System.out.println("當(dāng)前stack中的元素為:"+queue);queue.remove();System.out.println("當(dāng)前stack中的元素為:"+queue);System.out.println("當(dāng)前元素線性表是否為空:"+queue.empty());}}/*** 創(chuàng)建一個(gè)存儲(chǔ)的線性隊(duì)列* 注意這個(gè)類是線程不安全的,在多線程下不要使用* @author 小浩* @創(chuàng)建日期 2015-3-20* @param <T>*/ class SequenceQueue<T> {//線性隊(duì)列的默認(rèn)長(zhǎng)度private int DEFAULT_SIZE = 16;// 保存數(shù)組的長(zhǎng)度。private int capacity;// 定義一個(gè)數(shù)組用于保存順序隊(duì)列的元素private Object[] elementData;// 保存順序隊(duì)列中元素的當(dāng)前個(gè)數(shù)private int front = 0;private int rear = 0;/*** 以默認(rèn)數(shù)組長(zhǎng)度創(chuàng)建空順序隊(duì)列*/public SequenceQueue(){capacity = DEFAULT_SIZE;elementData = new Object[capacity];}/*** 以一個(gè)初始化元素來(lái)創(chuàng)建順序隊(duì)列* @param element*/public SequenceQueue(T element){this();elementData[0] = element;rear++;}/*** 以指定長(zhǎng)度的數(shù)組來(lái)創(chuàng)建順序隊(duì)列* @param element 指定順序隊(duì)列中第一個(gè)元素* @param initSize 指定順序隊(duì)列底層數(shù)組的長(zhǎng)度*/public SequenceQueue(T element , int initSize){this.capacity = initSize;elementData = new Object[capacity];elementData[0] = element;rear++;}/*** 獲取順序隊(duì)列的大小* @return*/public int length(){return rear - front;}/*** 插入隊(duì)列* @param element*/public void add(T element){if (rear > capacity - 1){throw new IndexOutOfBoundsException("隊(duì)列已滿的異常");}elementData[rear++] = element;}/*** 移出隊(duì)列* @return*/@SuppressWarnings("unchecked")public T remove(){if (empty()){throw new IndexOutOfBoundsException("空隊(duì)列異常");}// 保留隊(duì)列的front端的元素的值T oldValue = (T)elementData[front];// 釋放隊(duì)列的front端的元素elementData[front++] = null;return oldValue;}/*** 返回隊(duì)列頂元素,但不刪除隊(duì)列頂元素* @return*/@SuppressWarnings("unchecked")public T element(){if (empty()){throw new IndexOutOfBoundsException("空隊(duì)列異常");}return (T)elementData[front];}/*** 判斷順序隊(duì)列是否為空隊(duì)列* @return*/public boolean empty(){return rear == front;}/**清空順序隊(duì)列* */public void clear(){//將底層數(shù)組所有元素賦為nullArrays.fill(elementData , null);front = 0;rear = 0;}/*** 重寫toString方法*/public String toString(){if (empty()){return "[]";}else{StringBuilder sb = new StringBuilder("[");for (int i = front ; i < rear ; i++ ){sb.append(elementData[i].toString() + ", ");}int len = sb.length();return sb.delete(len - 2 , len).append("]").toString();}} }

?

  其次講解的是隊(duì)列的線性存儲(chǔ)的循環(huán)組成:

???? 對(duì)于上面的非循環(huán)存儲(chǔ)可能會(huì)非常大的浪費(fèi)空間,下面我們將要?jiǎng)?chuàng)建一個(gè)對(duì)應(yīng)的循環(huán)鏈表的概念,這樣的話可能會(huì)有效的節(jié)約相應(yīng)的空間。

???? 因?yàn)檠h(huán)鏈表可以有效的消除假滿的現(xiàn)象哦。

?????廢話不在多說(shuō),請(qǐng)看代碼:

?????

package com.yonyou.test;import java.util.Arrays;/*** 測(cè)試類* @author 小浩* @創(chuàng)建日期 2015-3-20*/ public class Test{ public static void main(String[] args) {LoopQueue<String> queue=new LoopQueue<String>();System.out.println("隊(duì)列的初始化長(zhǎng)度為:"+queue.length());queue.add("Hello");queue.add("World");queue.add("天下太平");System.out.println("當(dāng)前stack中的元素為:"+queue);queue.remove();System.out.println("當(dāng)前stack中的元素為:"+queue);System.out.println("當(dāng)前元素線性表是否為空:"+queue.empty());}}/*** 創(chuàng)建一個(gè)順序存儲(chǔ)的循環(huán)線性隊(duì)列* 注意這個(gè)類是線程不安全的,在多線程下不要使用* @author 小浩* @創(chuàng)建日期 2015-3-20* @param <T>*/ class LoopQueue<T> {//循環(huán)隊(duì)列的默認(rèn)長(zhǎng)度為16private int DEFAULT_SIZE = 16;// 保存數(shù)組的長(zhǎng)度。private int capacity;// 定義一個(gè)數(shù)組用于保存循環(huán)隊(duì)列的元素private Object[] elementData;// 保存循環(huán)隊(duì)列中元素的當(dāng)前個(gè)數(shù)private int front = 0;private int rear = 0;/*** 以默認(rèn)數(shù)組長(zhǎng)度創(chuàng)建空循環(huán)隊(duì)列*/public LoopQueue(){capacity = DEFAULT_SIZE;elementData = new Object[capacity];}/*** 以一個(gè)初始化元素來(lái)創(chuàng)建循環(huán)隊(duì)列* @param element*/public LoopQueue(T element){this();elementData[0] = element;rear++;}/*** 以指定長(zhǎng)度的數(shù)組來(lái)創(chuàng)建循環(huán)隊(duì)列* @param element 指定循環(huán)隊(duì)列中第一個(gè)元素* @param initSize 指定循環(huán)隊(duì)列底層數(shù)組的長(zhǎng)度*/public LoopQueue(T element , int initSize){this.capacity = initSize;elementData = new Object[capacity];elementData[0] = element;rear++;}/*** 獲取循環(huán)隊(duì)列的大小* @return*/public int length(){if (empty()){return 0;}return rear > front ? rear - front: capacity - (front - rear);}/*** 插入隊(duì)列* @param element*/public void add(T element){if (rear == front&& elementData[front] != null){throw new IndexOutOfBoundsException("隊(duì)列已滿的異常");}elementData[rear++] = element;// 如果rear已經(jīng)到頭,那就轉(zhuǎn)頭rear = rear == capacity ? 0 : rear;}/*** 移出隊(duì)列* @return*/@SuppressWarnings("unchecked")public T remove(){if (empty()){throw new IndexOutOfBoundsException("空隊(duì)列異常");}// 保留隊(duì)列的front端的元素的值T oldValue = (T)elementData[front];// 釋放隊(duì)列的front端的元素elementData[front++] = null;// 如果front已經(jīng)到頭,那就轉(zhuǎn)頭front = front == capacity ? 0 : front;return oldValue;}/*** 返回隊(duì)列頂元素,但不刪除隊(duì)列頂元素* @return*/@SuppressWarnings("unchecked")public T element(){if (empty()){throw new IndexOutOfBoundsException("空隊(duì)列異常");}return (T)elementData[front];}/*** 判斷循環(huán)隊(duì)列是否為空隊(duì)列* @return*/public boolean empty(){//rear==front且rear處的元素為nullreturn rear == front&& elementData[rear] == null;}/*** 清空循環(huán)隊(duì)列*/public void clear(){// 將底層數(shù)組所有元素賦為nullArrays.fill(elementData , null);front = 0;rear = 0;}/*** 重寫toString方法*/public String toString(){if (empty()){return "[]";}else{// 如果front < rear,有效元素就是front到rear之間的元素if (front < rear){StringBuilder sb = new StringBuilder("[");for (int i = front ; i < rear ; i++ ){sb.append(elementData[i].toString() + ", ");}int len = sb.length();return sb.delete(len - 2 , len).append("]").toString();}// 如果front >= rear,有效元素為front->capacity之間、// 和0->front之間的元素else{StringBuilder sb = new StringBuilder("[");for (int i = front ; i < capacity ; i++ ){sb.append(elementData[i].toString() + ", ");}for (int i = 0 ; i < rear ; i++){sb.append(elementData[i].toString() + ", ");}int len = sb.length();return sb.delete(len - 2 , len).append("]").toString();}}} }

?

  最后要說(shuō)的隊(duì)列的鏈?zhǔn)酱鎯?chǔ),具體的實(shí)現(xiàn)方式還是請(qǐng)看代碼吧。

??????

package com.yonyou.test;import java.util.Arrays;/*** 測(cè)試類* @author 小浩* @創(chuàng)建日期 2015-3-20*/ public class Test{ public static void main(String[] args) {LinkQueue<String> queue=new LinkQueue<String>();System.out.println("隊(duì)列的初始化長(zhǎng)度為:"+queue.length());queue.add("Hello");queue.add("World");queue.add("天下太平");System.out.println("當(dāng)前stack中的元素為:"+queue);queue.remove();System.out.println("當(dāng)前stack中的元素為:"+queue);System.out.println("當(dāng)前元素線性表是否為空:"+queue.empty());}}/*** 創(chuàng)建一個(gè)鏈?zhǔn)酱鎯?chǔ)的線性隊(duì)列* 注意這個(gè)類是線程不安全的,在多線程下不要使用* @author 小浩* @創(chuàng)建日期 2015-3-20* @param <T>*/ //定義一個(gè)內(nèi)部類Node,Node實(shí)例代表鏈隊(duì)列的節(jié)點(diǎn)。 class LinkQueue<T>{private class Node{// 保存節(jié)點(diǎn)的數(shù)據(jù)private T data;// 指向下個(gè)節(jié)點(diǎn)的引用private Node next;// 無(wú)參數(shù)的構(gòu)造器public Node(){}// 初始化全部屬性的構(gòu)造器public Node(T data , Node next){this.data = data;this.next = next;}}// 保存該鏈隊(duì)列的頭節(jié)點(diǎn)private Node front;// 保存該鏈隊(duì)列的尾節(jié)點(diǎn)private Node rear;// 保存該鏈隊(duì)列中已包含的節(jié)點(diǎn)數(shù)private int size;/*** 創(chuàng)建空鏈隊(duì)列*/public LinkQueue(){// 空鏈隊(duì)列,front和rear都是nullfront = null;rear = null;}/*** 以指定數(shù)據(jù)元素來(lái)創(chuàng)建鏈隊(duì)列,該鏈隊(duì)列只有一個(gè)元素* @param element*/public LinkQueue(T element){front = new Node(element , null);// 只有一個(gè)節(jié)點(diǎn),front、rear都指向該節(jié)點(diǎn)rear = front;size++;}/*** 返回鏈隊(duì)列的長(zhǎng)度* @return*/public int length(){return size;}/*** 將新元素加入隊(duì)列* @param element*/public void add(T element){// 如果該鏈隊(duì)列還是空鏈隊(duì)列if (front == null){front = new Node(element , null);// 只有一個(gè)節(jié)點(diǎn),front、rear都指向該節(jié)點(diǎn)rear = front;}else{// 創(chuàng)建新節(jié)點(diǎn)Node newNode = new Node(element , null);// 讓尾節(jié)點(diǎn)的next指向新增的節(jié)點(diǎn)rear.next = newNode;// 以新節(jié)點(diǎn)作為新的尾節(jié)點(diǎn)rear = newNode;}size++;}/*** 刪除隊(duì)列front端的元素* @return*/public T remove(){Node oldFront = front;front = front.next;oldFront.next = null;size--;return oldFront.data;}/*** 訪問(wèn)鏈?zhǔn)疥?duì)列中最后一個(gè)元素* @return*/public T element(){return rear.data;}/*** 判斷鏈?zhǔn)疥?duì)列是否為空隊(duì)列* @return*/public boolean empty(){return size == 0;}/*** 清空鏈隊(duì)列*/public void clear(){// 將front、rear兩個(gè)節(jié)點(diǎn)賦為nullfront = null;rear = null;size = 0;}/*** 重寫toString方法*/public String toString(){// 鏈隊(duì)列為空鏈隊(duì)列時(shí)if (empty()){return "[]";}else{StringBuilder sb = new StringBuilder("[");for (Node current = front ; current != null; current = current.next ){sb.append(current.data.toString() + ", ");}int len = sb.length();return sb.delete(len - 2 , len).append("]").toString();}} }

??

?? 這里還是補(bǔ)充一下吧,除了以上介紹的隊(duì)列外,我們還可以經(jīng)用到的一個(gè)隊(duì)列是雙端隊(duì)列。

? ?所謂雙端隊(duì)列指的是我們可以在隊(duì)列的兩端進(jìn)行插入和刪除操作。如果我們只允許在隊(duì)列的一端進(jìn)行插入和刪除的操作,那么隊(duì)列也就成為

?? 我們之前看到的棧了,是不是很有意思,沒(méi)錯(cuò)就是這樣的。其實(shí)棧,隊(duì)列其本質(zhì)都是一種受限制的線性表,只好不過(guò)限制的情況不同而已。

?? 還需要說(shuō)的jdk中Deque接口就是一個(gè)雙端隊(duì)列的實(shí)用接口。它可以理解為Queue和Stack的一個(gè)中和體。雖然上面的棧提到了類Stack,

?? 但是現(xiàn)在已經(jīng)不推薦使用了,一般情況,我們應(yīng)該使用Deque,因?yàn)樗墓δ芨訌?qiáng)大。

?? 在jdk中雙端隊(duì)列接口Deque有兩個(gè)實(shí)現(xiàn)類ArrayDeque(順序存儲(chǔ)的雙端隊(duì)列)和LinkedList(鏈?zhǔn)酱鎯?chǔ)的雙端隊(duì)列)

? 是不是發(fā)現(xiàn)了LinkedList的功能太強(qiáng)大了。沒(méi)錯(cuò),它就是這么任性,沒(méi)辦法。

? 下面的看一下它的部分源代碼:

?

* @since 1.2* @param <E> the type of elements held in this collection*/public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, java.io.Serializable

?

  implements List<E>, Deque<E>, Cloneable, java.io.Serializable

???? 看到紅色字體了了吧,剩下你懂的~~

??? 好吧,今天就先到這里吧~~~

?

?

  

?

??????

????

?

???

  

?

??

  

?

???

???

???

???

轉(zhuǎn)載于:https://www.cnblogs.com/xiohao/p/4354276.html

總結(jié)

以上是生活随笔為你收集整理的Java数据结构之线性表(2)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。