隊列是一種先進先出(FIFO)的線性表,只允許在一端(隊尾)進行插入操作,另一端(隊首)進行刪除操作。
隊列的順序存儲結構是用一組連續的地址空間存放隊列元素。在隊尾進行插入元素使空間不斷減少,而在隊首進行刪除操作使空間增多。順序隊列的弊端在於增加的空閒空間不能重新利用,而循環隊列的首尾連接在一起,進行刪除操作增加的空間能夠重新利用。
下面是代碼:
#include<stdio.h> #include<malloc.h> #define OK 0 #define ERROR -1 #define OVERFLOW -1 //循環隊列的存儲結構 #define MAXSIZE 100 typedef struct { int *base; int front; int rear; }queue; int init_queue(queue *q) { q->base = (int*)malloc(MAXSIZE * sizeof(int)); if(!q->base) exit(OVERFLOW); q->front = q->rear = 0; return OK; } int enqueue(queue * q, int e) { if((q->rear + 1)%MAXSIZE == q->front ) return ERROR; q->base[q->rear] = e; q->rear = (q->rear+1)%MAXSIZE; return OK; } int dequeue(queue * q, int *e) { if(q->rear == q->front) return ERROR; *e = q->base[q->front]; q->front = (q->front+1)% MAXSIZE; return OK; } int main() { queue q; int i; int e; printf("init queue\n"); init_queue(&q); printf("enqueue\n"); for(i = 0; i < 10; i++) { enqueue(&q, i); printf("%3d", i); } printf("\ndequeue\n"); for( i = 0; i < 10; i++) { dequeue(&q, &e); printf("%3d", e); } printf("\n"); return 0; }