在循环队列中,Q->front==Q->rear 并不能确定队列为空,也有可能是队列已满,所以采用“队列头指针在队列尾指针的下一位置”来判断队列已满(此方法会浪费一个内存空间)。
《数据结构(C语言版)[严蔚敏_吴伟民]》中63页有讲解。
此程序,在书中例子的基础上,增加了内存空间不足的重新分配。
define.h
1 // define.h
2 #ifndef __MENGQL_DEFINE__
3 #define __MENGQL_DEFINE__
4
5 #define C_LOG_DBG(format, ...)
6 //printf("[%s@%s,%d] " format ,__FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__);
7 #define C_LOG_ERR(format, ...) printf("[%s@%s,%d] " format ,__FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__);
8 typedef enum EStatus {ERROR, OK} Status;
9
10 #endif
SqQueue.h
1 // SqQueue.h
2 #ifndef __SQ_QUEUE_H__
3 #define __SQ_QUEUE_H__
4
5 #include "define.h"
6 #define MAXQSIZE 100
7
8 typedef struct
9 {
10 QElemType *base;
11 int front;
12 int rear;
13 int queuesize;
14 }SqQueue;
15
16 #endif
SqQueue.c
// SqQueue.c
typedef int QElemType;
#include "SqQueue.h"
#include <stdio.h>
#include <stdlib.h>
Status InitQueue(SqQueue *Q)
{
Q->queuesize = MAXQSIZE;
Q->base = (QElemType *)malloc(Q->queuesize * sizeof(QElemType));
if(Q->base == NULL)
{
C_LOG_ERR("%s", "malloc error!!!\n");
return ERROR;
}
Q->front = Q->rear = 0;
return OK;
}
int QueueLength(SqQueue *Q)
{
return ((Q->rear - Q->front + Q->queuesize) % Q->queuesize);
}
Status EnQueue(SqQueue *Q, QElemType e)
{
/*
在循环队列中,Q->front==Q->rear 并不能确定,队列为空,也有可能是队列已满,
所以采用“队列头指针在队列尾指针的下一位置”来判断队列已满(此方法会浪费一个内存空间)。
数据结构(C语言版)[严蔚敏_吴伟民]中63页有讲解。
*/
C_LOG_DBG("[%d][%d][%d]\n", Q->rear, Q->queuesize, Q->front);
if((Q->rear+1) % Q->queuesize == Q->front)
{
Q->base = (QElemType *)realloc(Q->base, Q->queuesize * 2 * sizeof(QElemType));
if(Q->base == NULL)
{
C_LOG_ERR("%s", "malloc error!!!\n");
return ERROR;
}
Q->queuesize *= 2;
}
Q->base[Q->rear] = e;
Q->rear = (Q->rear+1) % Q->queuesize;
return OK;
}
Status DeQueue(SqQueue *Q, QElemType *e)
{
if(Q->front == Q->rear)
{
C_LOG_ERR("%s", "queue is empty!!!\n");
return ERROR;
}
*e = Q->base[Q->front];
Q->front = (Q->front+1) % Q->queuesize;
return OK;
}
Status DestroyQueue(SqQueue *Q)
{
free(Q->base);
return OK;
}
int main()
{
SqQueue Q;
QElemType e;
int i;
InitQueue(&Q);
for(i=0; i<MAXQSIZE*10; ++i)
{
C_LOG_DBG("%d\n", i);
if(EnQueue(&Q, i) != OK)
{
return -1;
}
}
while(Q.front != Q.rear)
{
DeQueue(&Q, &e);
printf("%d\n", e);
}
DestroyQueue(&Q);
return 0;
}
来源:https://www.cnblogs.com/favourmeng/archive/2012/08/21/2649459.html