1 #define Queue_MAX_SIZE 20
  2 #define OK 1
  3 #define ERROR 0
  4 #include <stdio.h>
  5 #include <stdlib.h>
  6 typedef int QueueType; //队列元素类型
  7 typedef struct
  8 {
  9     QueueType *pBase;    //队列指针
 10     QueueType front;     //队头索引
 11     QueueType rear;      //队尾索引
 12     int maxSize;         //当前分配最大容量
 13 }Queue;
 14 //队列的初始化
 15 int InitQueue(Queue *p)
 16 {
 17     p->pBase = (QueueType *)malloc(Queue_MAX_SIZE * sizeof(QueueType));
 18     if (p->pBase == NULL) return ERROR; //内存分配失败
 19     p->front = 0;
 20     p->rear = 0;     //初始化 队头队尾索引均为0
 21     p->maxSize = Queue_MAX_SIZE;
 22     return 0;
 23 }
 24 //销毁队列
 25 void destroyQueue(Queue *p)
 26 {
 27     free(p);
 28     p = NULL;
 29 
 30 }
 31 //清空队列
 32 void clearQueue(Queue *p)
 33 {
 34     p->front = 0;
 35     p->rear = 0;
 36 }
 37 //判断队列是否为空
 38 int isEmpityQueue(Queue *p)
 39 {
 40     if (p->front == p->rear)
 41         return OK;
 42     return ERROR;
 43 
 44 }
 45 /*
 46  *在循环队列中,“队满”和“队空”的条件有可能是相同的,都是front==rear,
 47  *这种情况下,无法区别是“队满”还是“队空”。
 48  *针对这个问题,有3种可能的处理方法:
 49  *(1)另设一个标志以区别是“队满”还是“队空”。(即入队/出队前检查是否“队满”/“队空”)
 50  *(2)设一个计数器,此时甚至还可以省去一个指针。
 51  *(3)少用一个元素空间,即约定队头指针在队尾指针的下一位置时就作为“队满”的标志,
 52  *即“队满”条件为:(PQueue->rear+1)%MAX_SIZE == PQueue->front。
 53  *  【这里采用了第3种处理方法】
 54  */
 55 //判断队列是否满
 56 int isFullQueue(Queue *p)
 57 {
 58     if ((p->rear + 1) % p->maxSize == p->front)
 59         return OK;
 60     return ERROR;
 61 
 62 }
 63 //获得队列长度
 64 int getQueueLen(Queue *p)
 65 {
 66     return  (p->rear - p->front + p->maxSize) % p->maxSize;
 67 }
 68 //新元素入队
 69 int enQueue(Queue *p, QueueType e)
 70 {
 71     if (isFullQueue(p) == OK)
 72     {
 73         printf("队列已满\n");
 74         return ERROR;
 75     }
 76     p->pBase[p->rear] = e;
 77     p->rear = (p->rear + 1) % p->maxSize;
 78     return OK;
 79 }
 80 //队头元素出列
 81 int deQueue(Queue *p, QueueType *pe)
 82 {
 83     //如果队列为空 则返回ERROR
 84     if (isEmpityQueue(p) == OK)
 85     {
 86         printf("队列为空,出队失败\n");
 87         return ERROR;
 88 
 89     }
 90     *pe = p->pBase[p->front];
 91     p->front = (p->front + 1) % p->maxSize;
 92 
 93     return OK;
 94 }
 95 //遍历队列
 96 void queueTraverse(Queue *p)
 97 {
 98     int i = p->front;
 99     printf("遍历队列\n");
100     while (i != p->rear)
101     {
102         printf("%d ", p->pBase[i]);
103         i = (i + 1) % p->maxSize;
104     }
105     printf("\n");
106 
107 }
108 
109 int main()
110 {
111     QueueType *pe;
112     pe = (QueueType*)malloc(sizeof(QueueType));
113     Queue *PQueue = (Queue *)malloc(sizeof(Queue));
114     if (!PQueue->pBase)
115     {
116         printf("给队列对象分配内存失败\n");
117         return -1;
118     }
119 
120     //调用初始化队列的函数
121     InitQueue(PQueue);
122     //调用出队函数
123     enQueue(PQueue, 1);
124     enQueue(PQueue, 2);
125     enQueue(PQueue, 3);
126     enQueue(PQueue, 4);
127     enQueue(PQueue, 5);
128     enQueue(PQueue, 6);
129     enQueue(PQueue, 7);
130     enQueue(PQueue, 8);
131     //调用遍历队列的函数
132     queueTraverse(PQueue);
133     //调用出队函数
134     if (deQueue(PQueue, pe))
135     {
136         printf("出队一次,元素为:%d\n", *pe);
137     }
138     queueTraverse(PQueue);
139     if (deQueue(PQueue, pe))
140     {
141         printf("出队一次,元素为:%d\n", *pe);
142     }
143     queueTraverse(PQueue);
144 
145     destroyQueue(PQueue);
146 
147 
148     return 0;
149 
150 
151 
152 }

 

posted on 2019-03-17 10:20  0xcreed  阅读(377)  评论(0编辑  收藏  举报