一、链队列:
链队是指采用链式存储结果实现的队列,通常用单链表来表示。一个链队需要两个分别指示队头和队尾的指针才能确定。
代码:
#include#include //链队列的节点 typedef struct LinkNode{ int data; LinkNode* next; }*LinkNodePtr; //链队列. typedef struct LinkQueue{ LinkNodePtr front; LinkNodePtr rear; }*LinkQueuePtr; //初始化 LinkQueuePtr initQueue(){ LinkQueuePtr resultPtr = (LinkQueuePtr)malloc(sizeof(struct LinkQueue)); LinkNodePtr headerPtr = (LinkNodePtr)malloc(sizeof(LinkNodePtr)); headerPtr->next = NULL; resultPtr->front = headerPtr; resultPtr->rear = headerPtr; return resultPtr; } //输出队列元素 void outputLinkQueue(LinkQueuePtr paraQueuePtr){ LinkNodePtr tempPtr = paraQueuePtr->front->next; while (tempPtr != NULL) { printf("%d ", tempPtr->data); tempPtr = tempPtr->next; } printf("rn"); } //入队 void enqueue(LinkQueuePtr paraQueuePtr, int paraElement) { //创建一个新节点 LinkNodePtr tempNodePtr = (LinkNodePtr)malloc(sizeof(struct LinkNode)); tempNodePtr->data = paraElement; tempNodePtr->next = NULL; //将该节点与链表连接 paraQueuePtr->rear->next = tempNodePtr; //尾指针指向新的尾结点 paraQueuePtr->rear = tempNodePtr; } //出队 int dequeue(LinkQueuePtr paraQueuePtr) { int resultValue; LinkNodePtr tempNodePtr; //判断队列是否为空 if (paraQueuePtr->front == paraQueuePtr->rear) { printf("队列为空!n"); return -1; } tempNodePtr = paraQueuePtr->front->next; resultValue = tempNodePtr->data; paraQueuePtr->front->next = paraQueuePtr->front->next->next; if (paraQueuePtr->rear == tempNodePtr) { paraQueuePtr->rear = paraQueuePtr->front; } //free() tempNodePtr = NULL; return resultValue; } //功能测试 void testLinkQueue(){ LinkQueuePtr tempQueuePtr; tempQueuePtr = initQueue(); enqueue(tempQueuePtr, 10); enqueue(tempQueuePtr, 30); enqueue(tempQueuePtr, 50); enqueue(tempQueuePtr, 80); outputLinkQueue(tempQueuePtr); printf("dequeue gets %drn", dequeue(tempQueuePtr)); printf("dequeue gets %drn", dequeue(tempQueuePtr)); printf("dequeue gets %drn", dequeue(tempQueuePtr)); printf("dequeue gets %drn", dequeue(tempQueuePtr)); printf("dequeue gets %drn", dequeue(tempQueuePtr)); printf("dequeue gets %drn", dequeue(tempQueuePtr)); enqueue(tempQueuePtr, 8); outputLinkQueue(tempQueuePtr); } //main函数 int main(){ testLinkQueue(); return 1; }
运行结果:
10 30 50 80 dequeue gets 10 dequeue gets 30 dequeue gets 50 dequeue gets 80 队列为空! dequeue gets -1 队列为空! dequeue gets -1 8
二、循环队列
在循环队列中判断队空队满的条件:
队空的条件:Q.front = Q.rear
队满的条件:(Q.rear+1)%MAQSIZE == Q.front
代码:
#include#include #define MAXSIZE 5 typedef struct CircleIntQueue{ int data[MAXSIZE]; int front; int rear; }*CircleIntQueuePtr; //初始化 CircleIntQueuePtr initQueue() { CircleIntQueuePtr resultPtr = (CircleIntQueuePtr)malloc(sizeof(struct CircleIntQueue)); resultPtr->front = 0; resultPtr->rear = 0; return resultPtr; } //入队 void enqueue(CircleIntQueuePtr paraPtr, int paraValue) { if ((paraPtr->rear + 1) % MAXSIZE == paraPtr->front) { printf("Queue full.rn"); return; } paraPtr->data[paraPtr->rear % MAXSIZE] = paraValue; paraPtr->rear = (paraPtr->rear+1) % MAXSIZE; } //出队 int dequeue(CircleIntQueuePtr paraPtr) { int resultValue; if (paraPtr->front == paraPtr->rear) { printf("Queue is empty.rn"); return -1; } resultValue = paraPtr->data[paraPtr->front % MAXSIZE]; paraPtr->front = (paraPtr->front+1) % MAXSIZE; return resultValue; } //打印 void outputLinkQueue(CircleIntQueuePtr paraPtr) { //当队头指针和队尾指针相等时队为空 for(int i = paraPtr->front; i != paraPtr->rear; i = (i + 1) % MAXSIZE) { printf("data[%d] = %d ",i,paraPtr->data[i]); } printf("n"); } //功能测试 void testLinkQueue(){ int i = 10; CircleIntQueuePtr tempPtr = initQueue(); for (; i < 16; i ++) { enqueue(tempPtr, i); } outputLinkQueue(tempPtr); for (i = 0; i < 6; i ++) { printf("dequeue gets %drn", dequeue(tempPtr)); } enqueue(tempPtr, 8); enqueue(tempPtr, -10); enqueue(tempPtr, 15); outputLinkQueue(tempPtr); } int main() { testLinkQueue(); return 0; }
运行结果:
Queue full. Queue full. data[0] = 10 data[1] = 11 data[2] = 12 data[3] = 13 dequeue gets 10 dequeue gets 11 dequeue gets 12 dequeue gets 13 Queue is empty. dequeue gets -1 Queue is empty. dequeue gets -1 data[4] = 8 data[0] = -10 data[1] = 15



