赞
踩
循环队列就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。在循环队列结构中,当存储空间的最后一个位置已被使用而再要进入队运算时,只需要存储空间的第一个位置空闲,便可将元素加入到第一个位置,即将存储空间的第一个位置作为队尾。
为了区别这空和满时都有head=tail,规定循环队列最多只能有MaxSize-1个队列元素,当循环队列中只剩下一个空存储单元时,队列就已经满了。因此,队列判空的条件是head=tail,而队列判满的条件是head=(tail+1)%MaxSize。
- #include <stdio.h>
- #include <malloc.h>
-
- #define MAXSIZE 5
-
- typedef struct CircleIntQueue{
- int data[MAXSIZE];
- int head;
- int tail;
- }*CircleIntQueuePtr;
-
- CircleIntQueuePtr iniQueue(){
- CircleIntQueuePtr result = (CircleIntQueuePtr)malloc(sizeof(struct CircleIntQueue));
- result->head = 0;
- result->tail = 0;
- return result;
- }
-
- void enqueue(CircleIntQueuePtr pPtr,int pValue){
- if((pPtr->tail + 1) % MAXSIZE == pPtr->head){
- printf("Queue full.\n");
- return;
- }
-
- pPtr->data[pPtr->tail % MAXSIZE] = pValue;
- pPtr->tail++;
- }
-
- int dequeue(CircleIntQueuePtr pPtr){
- int result;
- if(pPtr->head == pPtr->tail){
- printf("No element in the queue.\n");
- return 0;
- }
-
- result = pPtr->data[pPtr->head % MAXSIZE];
- pPtr->head++;
-
- return result;
- }
-
- void printCircleQueue(CircleIntQueuePtr pPtr){
- int i;
- if(pPtr->head == pPtr->tail){
- printf("Empty queue.");
- return;
- }
-
- printf("Element in the queue:");
- for(i = pPtr->head;i < pPtr->tail;i ++){
- printf("%d,",pPtr->data[i % MAXSIZE]);
- }
- printf("\n");
- }
-
- void testCircleQueue(){
- int i = 10;
- CircleIntQueuePtr temp = iniQueue();
- for(;i < 16; i++){
- enqueue(temp,i);
- }
-
- printCircleQueue(temp);
-
- for(i = 0;i < 6;i ++){
- printf("dequeue gets %d\n",dequeue(temp));
- }
-
- enqueue(temp,8);
- printCircleQueue(temp);
- }
-
- int main(){
- testCircleQueue();
- return 0;
- }
- Queue full.
- Queue full.
- Element in the queue:10,11,12,13,
- dequeue gets 10
- dequeue gets 11
- dequeue gets 12
- dequeue gets 13
- No element in the queue.
- dequeue gets 0
- No element in the queue.
- dequeue gets 0
- Element in the queue:8,
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。