資料結構 3 4 棧與佇列

2022-02-02 12:33:24 字數 4470 閱讀 1343

學習資料:資料結構c語言版 清華大學出版社(以後的略)

這次一次過把棧和佇列都寫好了。棧和佇列 儲存結構和順序表有些像。不過棧是先進後出,佇列是先進先出。

棧和佇列的應用其實還是挺多的,不過我屬於入門學習階段……所以就先把最基本的**給實現了……學完整本課內要求的資料結構內容後會將這些各種各樣的資料結構應用在別的題目上的!!!

棧:時限定僅在表尾進行插入或者刪除操作的線性表。表尾成為棧頂,表頭段稱為棧底。不含元素的棧稱為空棧。

棧的實現:

1 #include2 #include3 #include4

using

namespace

std;

5#define true 1

6#define false 0

7#define ok 1

8#define error 0

9#define overflow -2

10#define stack_init_size 100//

儲存空間的初始分配量

11#define stackincrement 10//

儲存空間分配增量

1213 typedef int

status;

14 typedef int

selemtype;

15 typedef struct

node

16 stack;

2021

22 status isempty(stack *t)

2328

return

false;29}

30void initstack(stack *top)

3134 status push(stack *top,selemtype e)

3543 p->data=e;

44 p->next=top->next;

45 top->next=p;

46return

ok;47

}48 status pop(stack *top,selemtype &e)

4958

5960

intmain()

6169 stack *p=top->next;

70 printf("

the elemet in the stack:\n");

71while

(p)72

76 cout<7778

intx;

79pop(top,x);

80 cout<<"

the ele that you delete is

"<"."

<8182 p=top->next;

83 printf("

the elemet in the stack:\n");

84while

(p)85

89 p=null;

9091 cout<92 cout<<"

now pop all the data:

"<93while

(pop(top,x))

9497 cout<98free

(top);

99return0;

100 }

功能函式:

1、isempty:判斷棧是否為空,傳入指向頭結點的指標,判斷棧頂項是否為空。若為空返回true,否則返回false。

2、initstack:使傳入的頭結點指標乙個指為空。

3、push:創造乙個新的結點(分配相應的儲存空間),在該生成的結點的資料域裡面存放傳入的selemtype e。該生成的結點放在棧頂位置,原棧頂元素及以下均往後推乙個位置。(實現的時候只是改變了指標的指向,像單鏈表)。

4、pop:需要判斷棧是否為空。生成乙個指向棧的指標指向棧頂元素,釋放棧頂元素的空間,原指向棧頂的頭指標指向棧頂指向的next位址。會將出棧資料賦值到傳入的selemtype e上。方便輸出檢查結果。

5、主函式:對上述幾個函式進行了相應的測試。先為棧頂分配sizeof(stack)的記憶體空間,呼叫initstack函式將棧置空。將棧置空後呼叫push函式,以ctrl+z結束輸入。輸入一定的資料,將資料按順序壓入棧內,再調將壓入棧內的元素按照從棧頂到棧尾的順序輸出(其實我覺得我可以將這一段再寫乙個小函式,使**功能劃分更強……)。呼叫pop函式刪除棧頂元素後再遍歷輸出一次棧內元素。最後順序呼叫pop函式將所有剩餘的儲存的資料出棧。

queue;

19//

定義隊首隊尾

20 typedef struct

pointerqpointer;

2425

//佇列的初始化

26void queueinit(qpointer *qp)

2734

35int isempty(qpointer *qp)

3641

return

false;42}

4344

int queuepush(qpointer *qp,int

e)45

52 que->data=e;

53 que->next=null;

54 qp->rear->next=que;//

將節點插入佇列尾

55 qp->rear=que;

56return0;

57}58int queuepop(qpointer *qp,int *e)

5965 que=qp->front->next;//

que指向佇列頭結點的下乙個節點,即真正的隊首

66 *e=que->data;//

將要出佇列的元素

67 qp->front->next=que->next;

68//

判斷佇列是否就只剩下乙個元素

69if(qp->rear==que)

7073

free

(que);

74return

ok;75}76

77int

main()

7890 cout<<"

now output the queue.

"<91 queue *p=qp->front->next;

92if(p==null) return0;

93while

(p)94

98 printf("\n"

);99

//佇列的刪除

100101 printf("

delete the first data of queue:\n");

102 queuepop(qp,&x);

103 p=qp->front->next;

104if(p==null)

105return0;

106while

(p)107

111 cout<112//

佇列的最後刪除

113 printf("

delete queue:\n");

114while(queuepop(qp,&x))

115118 printf("\n"

);119 p=qp->front;

120free

(p);

121free

(qp);

122return0;

123124 }

佇列的定義:使用了兩個結構體去定義佇列。node結構體定義了乙個資料域和乙個指標域。pointer定義了隊首指標和隊尾指標,其中隊首指標指向的node資料域為空,隊尾指標指向的node存放隊尾的資料元素。

1、queueinit:佇列的初始化。在主函式中會生成乙個指向queue的指標。傳入這個指標,為其分配sizeof(queue)的記憶體空間。並使隊首和隊尾指向同乙個記憶體空間。

2、isempty:判斷佇列是否為空。判斷方法:隊首指標和隊尾指標是否相同。是返回true,否則返回false。

3、queuepush:為新生成的結點分配記憶體空間,需要判斷佇列是否為空。(為啥呢……)將傳入的e值賦給新生成結點的資料域。將新生成結點插入到隊尾。

4、queuepop:需要判斷佇列是否為空。將要出隊的元素賦值給傳入的位址e方便輸入檢查結果。需要最後判斷一下佇列是否只剩下了乙個元素,如果是的話就要將佇列的隊首賦值給隊尾(好銷毀)。最後釋放que指標。

5、主函式:佇列的初始化,先生成乙個指向qpointer的指標,為其分配記憶體空間。呼叫queueinit函式初始化。輸入資料以0結束(原本想用~scanf來寫,可是不知道為什麼不好使了……改了就出錯……)呼叫queuepush函式再次將輸入的資料入隊。順序輸出輸入的函式(其實我覺得可以寫乙個void的函式來實現這個過程……)。呼叫queuepop函式,將隊首元素出隊,再遍歷輸入隊裡的資料。最後像棧一樣多次呼叫queuepop函式將所有隊員出隊,最後銷毀指標,釋放記憶體空間。

實現了基礎的棧和佇列……比較開心。

資料結構 棧與佇列

題目 1.編寫函式,採用鏈式儲存實現棧的初始化 入棧 出棧操作 2.編寫函式,採用順序儲存實現棧的初始化 入棧 出棧操作 3.編寫函式,採用鏈式儲存實現佇列的初始化 入隊 出隊操作 4.編寫函式,採用順序儲存實現佇列的初始化 入隊 出隊操作 5.編寫乙個主函式,在主函式中設計乙個簡單的選單,分別除錯...

資料結構 棧與佇列

棧的原則是後進先出,即插入與刪除元素均在棧頂進行。獲取棧頂元素 s.top 佇列的原則是先進先出,即插入資料在隊尾進行,刪除資料在隊頭進行。獲取隊頭元素 q.front 思路 用兩個棧,乙個棧用來進隊,乙個棧用來出隊,當資料進入佇列的時候,我們將其壓入乙個棧,當資料出隊的時候,我們將儲存在棧內的資料...

資料結構 棧與佇列

1.順序棧 基本操作 typedef int elemtype 定義 順序棧 typedef struct sqstack 判空 bool stackempty sqstack s 進棧 bool push sqstack s elemtype x 出棧操作 bool pop sqstack s e...