堆疊和佇列都是特殊的線性表,線性表、堆疊和佇列三者的資料元素以及資料元素之間的邏輯關係完全相同。
差別:線性表的插入和刪除操作不受任何限制,而堆疊只能在棧頂插入和刪除,佇列只能在隊尾插入,在對頭刪除。
(順序表的鏈式表示)
堆疊有兩端,插入元素和刪除元素的一端為棧頂,另一端為棧底。對於鏈式堆疊來說,顯然,吧靠近頭指標的一端定義為棧頂,則插入元素和刪除元素時不需要遍歷整個鏈,其時間複雜度為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...