隊列(循環隊列和鏈隊)


順序隊列一般實現為循環隊列,因為普通的隊列可能產生“假溢出”。

1 struct SqQueue{
2     int data[maxSize];
3     int front;
4     int rear;
5 };

循環隊列的兩個狀態:

1.隊空

qu.rear == qu.front

2.隊滿  (注意,循環隊列必須損失一個存儲空間,用來區分隊空和堆滿,如果隊列中的所有空間對被占滿,那么隊空和隊滿的狀態都是qu.front == qu.rear,導致無法區分)

(qu.rear+1)%maxSize == qu.front

循環隊列的兩個操作:

1.進隊

1 qu.rear = (qu.rear+1)%maxSize     //  先移動指針,再存儲元素
2 qu.data[qu.rear] = x;

2.出隊

1 x = qu.data[qu.front];              //  先取元素,再移動指針
2 qu.front = (qu.front+1)%maxSize;

相關操作:

 1 void InitQueue(SqQueue &qu)
 2 {
 3     qu.front = qu.rear = 0;
 4 }
 5 
 6 int QueueEmpty(SqQueue qu)
 7 {
 8     if(qu.front==qu.rear)
 9         return 1;
10     else
11         return 0;
12 }
13 
14 int enQueue(SqQueue &qu,int x)
15 {
16     if((qu.rear+1)%maxSize == qu.front)  // 若隊滿,就不可再添加了
17         return 0;
18     qu.rear = (qu.rear+1)%maxSize;   // 先移動指針,在存入元素
19     qu.data[qu.rear]=x;
20     return 1;
21 }
22 
23 int deQueue(SqQueue &qu,int &x)
24 {
25     if(qu.front == qu.rear)    // 若隊空,就不可以刪除了
26         return 0;
27     x = qu.data[qu.front];            // 先取出元素,再移動指針
28     qu.front = (qu.front+1)%maxSize;
29     return 1;
30 }

還有一個計算循環隊列中實際元素個數的式子:

1  n = (qu.rear - qu.front + maxSize) % maxSize;

 

鏈隊

兩個狀態:

1.隊空

lqu->rear == NULL 或 lqu->front == NULL

2.隊滿

不存在隊滿的情況。

兩個操作:

1.進隊 (假設p指向進隊元素)

1 lqu->rear->next = p;
2 lqu->rear = p;

2.出隊 (假設p指向出隊元素,也就是隊首元素)

1 p = lqu->front;
2 lqu->front = p->next;
3 x = p->data;
4 free(p);

 

相關操作:

 1 //先定義結點
 2 struct QNode{
 3     int data;
 4     QNode *next;
 5 };
 6 // 定義鏈隊
 7 struct LQueue
 8 {
 9     QNode *front;
10     QNode *rear;
11 };
12 
13 void Init(LQueue *&lqu)
14 {
15     lqu = new LQueue;
16     lqu->front = lqu->rear = NULL;
17 }
18 
19 int QueueEmpty(LQueue *lqu)
20 {
21     if(lqu->front == NULL||lqu->rear == NULL)
22         return 1;
23     else 
24         return 0;
25 }
26 
27 void enQueue(LQueue *&lqu,int x)
28 {
29     QNode *p = new QNode;
30     p->data = x;
31     p->next = NULL;
32     if(lqu->rear == NULL)
33         lqu->front = lqu->rear = p;
34     else{
35         lqu->rear->next = p;
36         lqu->rear = p
37     }
38 }
39 
40 int deQueue(LQueue *&lqu,int &x)
41 {
42     QNode *p;
43     if(lqu->rear == NULL)
44         return 0;
45     else
46         p=lqu->front;
47 
48     if(lqu->front == lqu->rear)      // 當鏈隊中只有一個結點時,特殊處理
49         lqu->front=lqu->rear=NULL;
50     else
51         lqu->front = lqu->front->next;
52     x=p->data;
53     free(p);
54     return 1;
55 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM