1. 程式人生 > 實用技巧 >佇列的順序儲存實現

佇列的順序儲存實現

順序儲存佇列標頭檔案:

 1 #pragma once
 2 #include<stdlib.h>
 3 #include<stdio.h>
 4 #define MAX_SIZE 1024
 5 
 6 //順序佇列結構體
 7 typedef struct SEQQUEUE
 8 {
 9     void *data[MAX_SIZE];
10     int size;
11 }SeqQueue;
12 
13 //初始化佇列
14 SeqQueue* Init_SeqQueue();
15 //入隊
16 void Push_SeqQueue(SeqQueue* queue, void
* value); 17 //出隊 18 void Pop_SeqQueue(SeqQueue* queue); 19 //返回隊首元素 20 void* Front_SeqQueue(SeqQueue* queue); 21 //返回隊尾元素 22 void* Back_SeqQueue(SeqQueue* queue); 23 //返回佇列長度 24 int Size_SeqQueue(SeqQueue* queue); 25 //清空佇列 26 void Clear_SeqQueue(SeqQueue* queue); 27 //銷燬佇列 28 void Free_SeqQueue(SeqQueue* queue);

順序儲存佇列實現檔案:

  1 #include "佇列順序儲存.h"
  2 //初始化佇列
  3 SeqQueue* Init_SeqQueue()
  4 {
  5     SeqQueue* queue = (SeqQueue*)malloc(sizeof(SeqQueue));
  6     if (queue == NULL)
  7     {
  8         exit(1);
  9     }
 10 
 11     queue->size = 0;
 12     for (int i = 0; i < MAX_SIZE; ++i)
 13     {
14 queue->data[i] = NULL; 15 } 16 17 return queue; 18 } 19 //入隊陣列左邊做隊頭 20 void Push_SeqQueue(SeqQueue* queue, void* value) 21 { 22 if (queue == NULL) 23 { 24 exit(1); 25 } 26 27 if (value == NULL) 28 { 29 exit(1); 30 } 31 32 if (queue->size == MAX_SIZE) 33 { 34 exit(1); 35 } 36 37 queue->data[queue->size] = value; 38 queue->size++; 39 } 40 //出隊 41 void Pop_SeqQueue(SeqQueue* queue) 42 { 43 if (queue == NULL) 44 { 45 exit(1); 46 } 47 48 if (queue->size == 0) 49 { 50 exit(1); 51 } 52 53 for (int i = 0; i < queue->size-1; ++i) 54 { 55 queue->data[i] = queue->data[i + 1]; 56 } 57 queue->size--; 58 } 59 //返回隊首元素 60 void* Front_SeqQueue(SeqQueue* queue) 61 { 62 if (queue == NULL) 63 { 64 exit(1); 65 } 66 67 if (queue->size == 0) 68 { 69 exit(1); 70 } 71 72 return queue->data[0]; 73 } 74 //返回隊尾元素 75 void* Back_SeqQueue(SeqQueue* queue); 76 //返回佇列長度 77 int Size_SeqQueue(SeqQueue* queue) 78 { 79 if (queue == NULL) 80 { 81 exit(1); 82 } 83 84 return queue->size; 85 } 86 //清空佇列 87 void Clear_SeqQueue(SeqQueue* queue) 88 { 89 if (queue == NULL) 90 { 91 exit(1); 92 } 93 94 queue->size = 0; 95 } 96 //銷燬佇列 97 void Free_SeqQueue(SeqQueue* queue) 98 { 99 if (queue == NULL) 100 { 101 exit(1); 102 } 103 104 for (int i = 0; i < MAX_SIZE; ++i) 105 { 106 queue->data[i] = NULL; 107 } 108 queue->size = 0; 109 free(queue); 110 111 }

順序儲存佇列測試檔案:

 1 #include"佇列順序儲存.h"
 2 #include<string.h>
 3 #include<stdlib.h>
 4 #include<stdio.h>
 5 
 6 #define M 8
 7 #define N 3
 8 //資料元素結構體
 9 typedef struct PERSON
10 {
11     char name[64];
12     int age;
13 }Person;
14 
15 int main()
16 {
17     //建立迴圈連結串列
18     SeqQueue* queue = Init_SeqQueue();
19 
20     //建立資料
21     Person p1 = { "aaa",10 };
22     Person p2 = { "bbb",20 };
23     Person p3 = { "ccc",30 };
24     Person p4 = { "ddd",40 };
25     Person p5 = { "eee",50 };
26 
27     //入隊
28     Push_SeqQueue(queue, (Person*)&p1);
29     Push_SeqQueue(queue, (Person*)&p2);
30     Push_SeqQueue(queue, (Person*)&p3);
31     Push_SeqQueue(queue, (Person*)&p4);
32     Push_SeqQueue(queue, (Person*)&p5);
33     
34     //返回隊首元素
35     Person* temp = (Person*)Front_SeqQueue(queue);
36     printf("value: %s age: %d\n", temp->name, temp->age);
37 
38     //出隊
39     Pop_SeqQueue(queue);
40     
41     //返回隊首元素
42     temp = (Person*)Front_SeqQueue(queue);
43     printf("value: %s age: %d\n", temp->name, temp->age);
44 
45     int size = Size_SeqQueue(queue);
46     printf("長度%d\n", size);
47 
48     //清空佇列
49     Clear_SeqQueue(queue);
50 
51     size = Size_SeqQueue(queue);
52     printf("長度%d\n", size);
53     //銷燬佇列
54     Free_SeqQueue(queue);
55     return 0;
56 }

測試結果: