静态数组队列(循环队列)基本操作

来源:互联网 发布:人工智能观后感5中英文 编辑:程序博客网 时间:2024/06/05 16:52
/*静态数组队列(循环队列):C语言实现版*//*特点:队列大小固定,可以防止伪溢出发生*/#include <stdio.h>#include <stdlib.h>/*定义队列*/#define MAX_Q_SIZE 5 /*最大队列长度+1 ,实际长度为4*/typedef struct {int *base ; /*初始化时分配存储空间,假设元素类型为int*/int front ; /*头指针,实际上为数组下标*/int rear  ; /*尾指针,实际上为数组下标*/} Queue ;/*1、队列初始化(构造一个空队列,提前分配好空间)*/int QueueInit(Queue *Q){Q->base = (int *)malloc(MAX_Q_SIZE*sizeof(int)) ; /*提前分配好空间*/if(!Q->base)return -1 ;Q->front = Q->rear = 0 ; /*空队列*/return 0 ;}/*2、清空队列(不释放分配的空间,注意和销毁队列的区别)*/void ClearQueue(Queue *Q){Q->front = Q->base = 0 ;}/*3、销毁队列(释放base指向空间)*/void DestroyQueue(Queue *Q){if(Q->base)free(Q->base) ;Q->base = NULL ;Q->front = Q->rear = 0 ; /*将头尾指针置零*/}/*4、判断是否为空队列:Q->front == Q->rear*/int QueueEmpty(Queue *Q){if(Q->front == Q->rear)return -1 ;return 0 ;}/*5、队列长度 :(Q->rear - Q->front+MAX_Q_SIZE)%MAX_Q_SIZE*/int QueueLen(Queue *Q){return (Q->rear - Q->front+MAX_Q_SIZE)%MAX_Q_SIZE ;}/*6、求队列头元素*/int GetHead(Queue *Q , int *e){if(QueueEmpty(Q)) /*先判断队列是否为空*/return -1 ; *e = Q->base[Q->front] ;return 0 ;}/*7、求队列尾元素*/int GetTail(Queue *Q , int *e){if(QueueEmpty(Q)) /*先判断队列是否为空*/return -1 ; *e = Q->base[Q->rear] ;return 0 ;}/*8、插入队尾新元素e,要先判断队列是否已满:(Q->rear+1)%MAX_Q_SIZE == Q->front*/int EnQueue(Queue *Q , int e){if((Q->rear+1)%MAX_Q_SIZE == Q->front)return -1 ;Q->base[Q->rear] = e ; /*插入新的队尾元素*/Q->rear = (Q->rear+1)%MAX_Q_SIZE ; /*更新队尾指针*/return 0 ;}/*9、删除头,存在e中*/int DeQueue(Queue *Q , int *e){if(QueueEmpty(Q))return -1 ;*e = Q->base[Q->front] ;Q->front = (Q->front+1)%MAX_Q_SIZE ;/*更新队头指针*/return 0 ;}/*10、遍历队列元素*/int TraverseQueue(Queue *Q){if(QueueEmpty(Q))return -1 ;int i = Q->front ;printf("TraverseQueue begin ! \n");while(i != Q->rear){printf("%d \n" , Q->base[i]) ;i = (i+1)%MAX_Q_SIZE ;}printf("TraverseQueue end ! \n");return 0 ;}int main(void){Queue Q ;QueueInit(&Q) ;int i ;int e ;for(i = 0; i<10 ; i++){if(EnQueue(&Q,i)) /*如果尾部入队失败,即队列已满*/{DeQueue(&Q , &e) ; /*删除头并将头元素打印出来*/printf("Queue Full! DeQueue = %d\n" , e) ;EnQueue(&Q,i) ; /*继续入队*/}}TraverseQueue(&Q) ;return 0 ;}

只要记住以下要点

1.队列的长度:(Q->rear-Q->front+ MAX_Q_SIZE)% MAX_Q_SIZE

      : MAX_Q_SIZE = 5 (= 4+1)的话,(1(front),2,3,4,5(rear))那么长度为4

2.队列为空的条件: Q->rear==Q->front

3.队列满的条件: (Q->rear+1)% MAX_Q_SIZE == Q->front

4.更新头指针(删除头):Q->front= (Q->front+1)% MAX_Q_SIZE

5.更新尾指针(插入尾):Q->rear= (Q->rear+1) % MAX_Q_SIZE

另外,这个循环队列在分配时长度是固定的(4),初始化时已经静态分配完成。当队列已满时,需要自己删除头并取出来,再插入尾,这样操作循环队列才有意义。

0 0
原创粉丝点击