資料結構 堆疊和佇列

2021-07-10 23:02:03 字數 1707 閱讀 2488

堆疊和佇列都是特殊的線性表,線性表、堆疊和佇列三者的資料元素以及資料元素之間的邏輯關係完全相同。

差別:線性表的插入和刪除操作不受任何限制,而堆疊只能在棧頂插入和刪除,佇列只能在隊尾插入,在對頭刪除。

順序表的鏈式表示

堆疊有兩端,插入元素和刪除元素的一端為棧頂,另一端為棧底。對於鏈式堆疊來說,顯然,吧靠近頭指標的一端定義為棧頂,則插入元素和刪除元素時不需要遍歷整個鏈,其時間複雜度為o(1);否則,若把遠離頭指標的一端定義為棧頂,則每次插入元素和刪除元素都需要遍歷整條鏈,其時間複雜度為o(n).

因此,鏈式堆疊一般設計把靠近頭指標的一端為棧頂

雖然鏈式堆疊的插入和刪除都是在鍊錶的表頭進行的,但是若把鏈式堆疊設計成帶頭結點的結構,,則插入和刪除改變的只是頭指標所指向結點的next域的值(即head->next值),而不是頭指標的值,因此可以把鏈式堆疊設計成帶頭結點的結構

鏈式堆疊結點的結構體定義:

typedef

struct snode

lsnode;

(1.)初始化stackinitiate(lsnode **head)

void satckinitiate(lsnode **head) //初始化帶頭結點的鏈式堆疊

(2.)非空否stacknotempty(lsnode *head)

int stacknotemtpty(lsnode *head)  //判斷堆疊是否為空,如果為空,返回1,否則返回0

(3.)入棧stackpush(lsnode *head,datatype x)

void stackpush(lsnode *head,datatype x)  //把資料元素x插入鏈式堆疊head的棧頂作為新的棧頂

(4.)出棧stackpop(lsnode *head,datatype *d)

int stackpop(lsnode *head,datatype *d)   //出棧並把棧頂元素由引數d帶回,出棧成功返回1,否則返回0

head->next=p->next; //刪除原棧頂結點

*d=p->

data; //原棧頂結點元素賦予d

free(p); //釋放原棧頂結點記憶體空間

return

1;}

(5.)取棧頂資料元素stacktop(lsnode *head,datatype *d)

int stacktop(lsnode *head,datatype *d)   //取棧頂元素並把棧頂元素由引數d帶回

*d=p->data;

return

1;}

(6.)撤銷動態申請空間destory(slnode *head)

void destory(slnode *head)

}

上述實現鏈式堆疊的所有函式中,沒有迴圈語句,所以鏈式堆疊所有操作的時間複雜度均為o(1)

上述鏈式堆疊結點的結構體定義和操作的實現函式都寫在標頭檔案linstack.h中

資料結構 堆疊和佇列

在資料結構中,有些簡單的線性結構是非常常用的,比如說堆疊可以用於實現函式的呼叫,佇列可以處理一些需要排隊的問題,下面就簡單介紹一下這兩種資料結構。一 堆疊 堆疊是一種特殊的資料結構,特點是filo first in,last out 而且處理的元素也只可以在棧頂這一端。下面給出堆疊常用介面,例如進棧...

資料結構 堆疊和佇列

主要是用於實現堆疊資料結構的儲存方式。先進後出 push pop 使用linkedlist模擬堆疊的資料結構儲存方式 class stacklist 進棧 public void add object o 彈棧 把元素刪除並返回。public object pop 獲取元素個數 public int...

資料結構基礎 堆疊佇列

棧主要講解 佇列主要講解 說明 所有原始碼均可以在idea上除錯。堆的實現 大小頂堆 原始碼和測試案例 查詢第k大的元素 堆排 原始碼和測試案例 優先佇列 棧的基本功能包括 入棧 push 出棧 pop 獲取棧頂元素 peek 獲取棧中實際容量 getrealsize 獲取棧中最大容量 getmax...