C語(yǔ)言 表、棧和隊(duì)列詳解及實(shí)例代碼
C語(yǔ)言 表、棧和隊(duì)列詳解
表ADT
形如A1,A2,A3…An的表,這個(gè)表的大小為n,而大小為0的表稱為空表,非空表中,Ai+1后繼Ai,Ai-1前驅(qū)Ai,表ADT的相關(guān)操有PrintList打印表中的元素;CreateEmpty創(chuàng)建一個(gè)空表;Find返回關(guān)鍵字首次出現(xiàn)的位置;Insert和Delete從表的某個(gè)位置插入和刪除某個(gè)關(guān)鍵字。
對(duì)表的所有操作都可以通過(guò)使用數(shù)組來(lái)實(shí)現(xiàn),但在這里使用鏈表的方式來(lái)實(shí)現(xiàn)。鏈表(linked list)由一系列不必在內(nèi)存中相連的結(jié)構(gòu)組成,每個(gè)結(jié)構(gòu)均含有元素和指向包含該元素后繼元的結(jié)構(gòu)的指針。鏈表的結(jié)構(gòu)有很多種,單向鏈表、雙向鏈表、循環(huán)鏈表、有無(wú)表頭的鏈表,這里以有表頭結(jié)點(diǎn)的單向鏈表為例,其余幾種的實(shí)現(xiàn)思路相同。
首先定義鏈表的結(jié)構(gòu):
struct Node { ElementType Element; Node *Next; };
表ADT的主要操作:
Node *CreateEmpty() { Node *header = new Node; Header->Element = 0; Header->Next = NULL; return header; } void PrintList(Node *List) { Node *p = List->Next; While (p) { std::cout << p->Element << “ “; } } Node *Find(Node *List, ElementType X) { Node *p = List->Next; while(p && p->Element != X) { p = p->Next; } return p; } void Insert(Node *List, ElementType X) { Node *p = List; while(p->Next) { p = p->Next; } p->Next = new Node; p = p->Next; p->Next = NULL; p->Element = X; } void Delete(Node *List, ElementType X) { Node *p = List->Next; Node *d = p->Next; while(d->Element != X) { p = p->Next; d = p->Next; } p->Next = d->Next; delete d; }
以上是基本的幾個(gè)操作,可以看到,操作中沒(méi)有對(duì)鏈表是否為空進(jìn)行檢測(cè),在刪除操作中存在隱患。
棧ADT
棧(stack)是限制插入和刪除只能在一個(gè)位置上進(jìn)行的表,該位置是表的末端,叫做棧的頂(top)。對(duì)棧的基本操作有Push(進(jìn)棧)和Pop(出棧),前者相當(dāng)于插入,后者相當(dāng)于刪除最后插入的元素。
棧的實(shí)現(xiàn)可以是指針,或者使用數(shù)組,數(shù)組的實(shí)現(xiàn)在筆者前面的已經(jīng)介紹過(guò)了,今次使用單鏈表的方式實(shí)現(xiàn)。
首先,棧的結(jié)構(gòu)定義:
struct Stack { ElementType Element; Stack *Next; };
棧ADT的主要操作:
Stack *CreateStack() { Stack *S = new Stack; S->Next = NULL; return S; } void Push(Stack *S, ElementType X) { Stack *p = new Stack; p->Next = S; S->Element = X; S = p; } ElementType Pop(Stack *S) { Stack *p = S; if(S->Next) { S = S->Next; delete p; } return S->Element; }
隊(duì)列ADT
像棧一樣,隊(duì)列也是一種表,然而,使用隊(duì)列時(shí)插入在一端進(jìn)行而刪除則在另一端進(jìn)行。隊(duì)列的基本操作時(shí)Enqueue(入隊(duì))和Dequeue(出隊(duì)),入隊(duì)是指在表的末端rear插入一個(gè)元素,而出隊(duì)是刪除(或者返回)在表的開頭front的元素。
如同棧的情形一樣,棧的實(shí)現(xiàn)可以用指針和數(shù)組的方式,數(shù)組的方式筆者同樣在之前做過(guò)介紹,今次使用單鏈表的方式實(shí)現(xiàn)。
首先,定義隊(duì)列的結(jié)構(gòu):
struct Queue { ElementType Element; Queue *Next; };
隊(duì)列ADT的主要操作:
Queue *CreateQueue() { Queue *p = new Queue; p->Next = NULL; return p; } void Enqueue(Queue *rear, ElementType X) { Queue *p = new Queue; p->Element = X; rear->Next = p; rear = p; } ElementType Dequeue(Queue *front) { Queue *p = front; ElementType e = front->Element; front = front->Next; delete p; return e; }
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- C語(yǔ)言 淺談棧與隊(duì)列的定義與操作
- C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)進(jìn)階之棧和隊(duì)列的實(shí)現(xiàn)
- C語(yǔ)言編程數(shù)據(jù)結(jié)構(gòu)棧與隊(duì)列的全面講解示例教程
- C語(yǔ)言編程數(shù)據(jù)結(jié)構(gòu)的棧和隊(duì)列
- C語(yǔ)言中棧和隊(duì)列實(shí)現(xiàn)表達(dá)式求值的實(shí)例
- C語(yǔ)言用棧和隊(duì)列實(shí)現(xiàn)的回文檢測(cè)功能示例
- 深入淺析C語(yǔ)言中堆棧和隊(duì)列
- C語(yǔ)言超詳細(xì)講解棧與隊(duì)列實(shí)現(xiàn)實(shí)例
相關(guān)文章
C語(yǔ)言 結(jié)構(gòu)體和指針詳解及簡(jiǎn)單示例
本文主要介紹C語(yǔ)言 結(jié)構(gòu)體和指針,這里整理了相關(guān)資料,并附示例代碼和實(shí)現(xiàn)結(jié)果,以便大家學(xué)習(xí)參考,希望能幫助學(xué)習(xí)C語(yǔ)言的朋友2016-08-08Matlab實(shí)現(xiàn)繪制有氣泡感的網(wǎng)絡(luò)圖
這篇文章主要介紹了如何利用Matlab實(shí)現(xiàn)繪制有氣泡感的網(wǎng)絡(luò)圖,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定的幫助,需要的可以參考一下2023-02-02C++中構(gòu)造函數(shù)與析構(gòu)函數(shù)的詳解及其作用介紹
這篇文章主要介紹了C++中構(gòu)造函數(shù)與析構(gòu)函數(shù)的詳解及其作用介紹,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09關(guān)于C++友元類的實(shí)現(xiàn)講解
今天小編就為大家分享一篇關(guān)于關(guān)于C++友元類的實(shí)現(xiàn)講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12QT TCP實(shí)現(xiàn)簡(jiǎn)單的通信示例
這篇文章主要為大家詳細(xì)介紹了QT TCP簡(jiǎn)單的通信示例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08淺談C語(yǔ)言共用體和與結(jié)構(gòu)體的區(qū)別
下面小編就為大家?guī)?lái)一篇淺談C語(yǔ)言共用體和與結(jié)構(gòu)體的區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02