鍊錶 佇列和棧的區別

2021-07-16 08:06:20 字數 2933 閱讀 2109

鍊錶、佇列和棧的區別

鍊錶,佇列和棧都是資料結構的一種。sartaj sahni 在他的《資料結構、演算法與應用》一書中稱:「資料結構是資料物件,以及存在於該物件的例項和組成例項的資料元素之間的各種聯絡。這些聯絡可以通過定義相關的函式來給出。」他將資料物件(data object)定義為「乙個資料物件是例項或值的集合」。

一. 鍊錶

1.定義

鍊錶(linked list)是一種常見的基礎資料結構,是一種線性表,但是並不會按線性的順序儲存資料,而是在由乙個個節點組成,每個節點(node)中儲存著資料變數(data)和指標變數(node next),又有乙個頭節點(head)連線下面的節點,而最後乙個節點指向空(null)。可以在鍊錶類中定義增加,刪除,插入,遍歷,修改等方法,故常用來儲存資料。

2.優點

(1).使用鍊錶結構可以克服陣列鍊錶需要預先知道資料大小的缺點,鍊錶結構可以充分利用計算機記憶體空間,實現靈活的記憶體動態管理。

(2).資料的訪問往往要在不同的排列順序中轉換,而鍊錶是一種自我指示資料型別,因為它包含指向另乙個相同型別的資料的指標(鏈結)。鍊錶允許插入和移除表上任意位置上的節點,但是不允許隨機訪問。

3.缺點

鍊錶失去了陣列隨機讀取的優點,同時鍊錶由於增加了結點的指標域,空間開銷比較大。

4.型別

主要有單向鍊錶,雙向鍊錶以及迴圈鍊錶。

5.與陣列對比

鍊錶的使用不需要知道資料的大小,而陣列在建立時必須指明陣列的大小。

鍊錶沒有對應的下標,只有指向下乙個資料的指標,而陣列中每乙個都有乙個相對應的下標。

鍊錶在記憶體中儲存的資料可以是不連續的,而陣列儲存的資料佔記憶體中連續的一段,用識別符號標識。

二. 佇列定義

佇列是一種特殊的線性表,它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。佇列中沒有元素時,稱為空佇列。

在佇列這種資料結構中,最先插入的元素將是最先被刪除的元素;反之最後插入的元素將最後被刪除的元素,因此佇列又稱為「先進先出」(fifo—first in first out)的線性表。

佇列的使用和假溢位

佇列可以用陣列q[1…m]來儲存,陣列的上界是m,最大容量是m。在佇列的運算中需設兩個指標:隊頭指標(head),指向實際隊頭元素的前乙個位置;隊尾指標(tail),指向實際隊尾元素所在的位置,佇列中擁有的元素個數為:n=tail-head。一般情況下,兩個指標的初值設為0,這時隊列為空,沒有元素。

若陣列定義q[1…10],head=2,tail=8。如果要讓排頭的元素出隊,則需將頭指標加1。即head=head+1這時頭指標向上移動乙個位 置,指向q(3),表示q(3)已出隊。如果想讓乙個新元素入隊,則需尾指標向上移動乙個位置。即tail=tail+1這時q(9)入隊。當隊尾已經處 理在最上面時,即tail=10,如果還要執行入隊操作,則要發生」上溢」,但實際上佇列中還有三個空位置,所以這種溢位稱為」假溢位」。

迴圈佇列的概念

為充分利用向量空間,克服」假溢位」現象的方法是:將向量空間想象為乙個首尾相接的圓環,並稱這種向量為迴圈向量。儲存在其中的佇列稱為迴圈佇列(circular queue)。

迴圈佇列的入隊演算法:

(1). tail=tail+1;

(2). 若tail=m+1,則tail=1;

(3). 若head=tail尾指標與頭指標重合了,判斷空或滿;

(4). 否則,q[tail]=x,結束(x為新入出元素)。

迴圈佇列的出隊演算法:

(1). 若head=tail尾指標與頭指標重合了,判斷空或滿;

(2). 若不重合head=head+1;

(3). 若head=m+1,則head=1;

(4). 移除q[head],結束。

迴圈佇列中,由於入隊時尾指標向前追趕頭指標;出隊時頭指標向前追趕尾指標,造成隊空和隊滿時頭尾指標均相等。因此,無法通過條件front==rear來判別佇列是」空」還是」滿」。

解決這個問題的方法至少有兩種:

① 另設一布林變數以區別佇列的空和滿;

② 另一種方式就是資料結構常用的: 隊滿時:(tail+1)%n=head,n為佇列長度(所用陣列大小),由於tail,head均為所用空間的指標,迴圈只是邏輯上的迴圈,所以需要求 餘運算。如圖情況,隊已滿,但是tail+1=5+1=6,n=6,求餘6%6=0=head。

三. 棧 定義

棧(stack),是硬體。主要作用表現為一種資料結構,是只能在某一端插入和刪除的特殊線性表。它按照後進先出的原則儲存資料,先進入的資料被壓入棧底,最後的資料在棧頂,需要讀資料的時候從棧頂開始彈出資料(最後乙個資料被第乙個讀出來)。

棧是允許在同一端進行插入和刪除操作的特殊線性表。允許進行插入和刪除操作的一端稱為棧頂(top),另一端為棧底(bottom);棧底固定,而棧頂浮動;棧中元素個數為零時稱為空棧。插入一般稱為進棧(push),刪除則稱為退棧(pop)。 棧也稱為先進後出表。

棧的方法

empty() 測試堆疊是否為空。返回boolean。

peek() 檢視堆疊頂部的物件,但不從堆疊中移除它。返回泛型e。

pop() 移除堆疊頂部的物件,並作為此函式的值返回該物件。返回泛型e。

push(e item) 把項壓入堆疊頂部。返回泛型e。

search(object o) 返回物件在堆疊中的位置,以 1 為基數。返回int。

棧的實現

1、進棧(push)演算法

①若top≥n時,則給出溢位資訊,作出錯處理(進棧前首先檢查棧是否

已滿,滿則溢位;不滿則作②);

②置top=top+1(棧指標加1,指向進棧位址);

③s(top)=x,結束(x為新進棧的元素);

2、退棧(pop)演算法

①若top≤0,則給出下溢資訊,作出錯處理(退棧前先檢查是否已為空棧,

空則下溢;不空則作②);

②x=s(top),(退棧後的元素賦給x):

③top=top-1,結束(棧指標減1,指向棧頂)。

鍊錶,棧和佇列

1.建立鍊錶 package com.zzw.鍊錶 非常基本的單項鍊表 author john public class node 新增乙個結點 node end new node d node n this while n.next null n.next end 刪除單向鍊錶中的結點 node ...

棧 佇列與鍊錶的區別

占用的記憶體空間 鍊錶存放的記憶體空間可以是連續的,也可以是不連續的,陣列則是連續的一段記憶體空間。一般情況下存放相同多的資料陣列占用較小的記憶體,而鍊錶還需要存放其前驅和後繼的空間。長度的可變性 鍊錶的長度是按實際需要可以伸縮的,而陣列的長度是在定義時要給定的,如果存放的資料個數超過了陣列的初始大...

向量 鍊錶 棧和佇列

三 不足之處 自學資料結構和演算法到現在時間也不短了,一直猶豫著要不要寫一寫向量等幾個最最基本的資料結構,因為總覺得是最基本的,太容易了,不想花這個時間去寫。然而學著學著慢慢發現,雖然這個很基本,但我並不一定能夠做好 尤其是以前的我 實際上我幾次因為需要寫過簡單的結構,但是沒有專門寫過,而且體驗也不...