基於C語言實現順序佇列
阿新 • • 發佈:2019-02-16
棧和佇列的區別在於,棧是先進後出,而佇列是先進先出下面為入佇列的過程下面為出佇列的操作下面是基於順序表來實現佇列的一些操作對於佇列操作,為了操作方便,需要設立三個變數,分別為head,tail和size,分別表示,連結串列的頭部、尾部和連結串列的長度
入佇列入佇列其實就相當於在連結串列中插入一個節點,有兩種方法,一種為頭插法,一種為尾插法,在這裡採用的是頭插法,詳細見程式
出佇列就相當於順序表的頭刪或者尾刪的方法,在這裡選擇的是順序表的頭刪法,詳細見程式 取隊首元素
5 typedef struct SeqQueue
6 {
7 SeqQueueType data[SeqQueueMaxSize];
8 size_t head;
9 size_t tail;
10 size_t size;
11 }SeqQueue;
佇列初始化佇列初始化是將之前在結構體中設立的三個變數都置為0,詳細見程式銷燬佇列在這裡碰巧和佇列初始化相同5 //佇列初始化 6 void SeqQueueInit(SeqQueue* q) 7 { 8 if(q == NULL) 9 { 10 //非法操作 11 return ; 12 } 13 q->size = 0; 14 q->head = 0; 15 q->tail = 0; 16 return ; 17 }
20 void SeqQueueDestroy(SeqQueue* q)
21 {
22
23 if(q == NULL)
24 {
25 //非法操作
26 return ;
27 }
28 q->size = 0;
29 q->head = 0;
30 q->tail = 0;
31 return ;
32 }
入佇列入佇列其實就相當於在連結串列中插入一個節點,有兩種方法,一種為頭插法,一種為尾插法,在這裡採用的是頭插法,詳細見程式
出佇列34 //入隊 35 void SeqQueuePush(SeqQueue* q,SeqQueueType value) 36 { 37 if(q == NULL) 38 { 39 //非法操作 40 return; 41 } 42 if(q->size>=SeqQueueMaxSize) 43 { 44 //佇列已滿 45 return; 46 } 47 q->data[q->tail++]=value; 48 if(q->tail>=SeqQueueMaxSize) 49 { 50 q->tail=0; 51 } 52 ++q->size; 53 } 54
出佇列就相當於順序表的頭刪或者尾刪的方法,在這裡選擇的是順序表的頭刪法,詳細見程式
55 //出隊 56 void SeqQueuePop(SeqQueue* q) 57 { 58 if(q == NULL) 59 { 60 //非法操作 61 return; 62 } 63 if(q->size == 0) 64 { 65 //佇列為空 66 return ; 67 } 68 ++q->head; 69 --q->size; 70 if(q->head == SeqQueueMaxSize) 71 { 72 q->head=0; 73 } 74 }
75 //取隊首元素
76 int SeqQueueFront(SeqQueue* q,SeqQueueType* value)
77 {
78 if(q == NULL || value == NULL)
79 {
80 //非法操作
81 return 0;
82 }
83 if(q->size == 0)
84 {
85 //佇列為空
86 return 0;
87 }
88 *value=q->data[q->head];
89 return 1;
90 }