队列即可以用链表实现也可以用顺序表实现,跟栈相反的是,栈一般用顺序表实现而队列用链表来实现,简称为链队列,我们将队头指针指向链队列的头结点,队尾指针指向终端结点(头结点不是必要的,但为了方便操作我们加上了头结点)。
一、队列的链式存储
1、链队列的存储结构
//队列的存储结构 typedef struct QNode{ ElemType data; struct QNode *next; }QNode,*QueuePtr; typedef struct{ QueuePtr front; //队头指针 QueuePtr rear; //队尾指针 }LinkQueue;
2、初始化一个队列
创建一个队列要完成两个任务,一是在内存中创建一个头结点,二是将队列的头指针和头结点指向这个生成的头结点,此时是空队列
//创建一个队列 Status InitQueue(LinkQueue &q){ q->front = q->rear = (QueuePtr)malloc(sizeof(QNode)); if( !q->front ) exit(0); q->front->next = NULL; return OK; }
3、入队操作
//入队操作 Status InsertQueue(LinkQueue &q, ElemType e){ QueuePtr p; p = (QueuePtr)malloc(sizeof(QNode)); if( p == NULL ) exit(0); p->data = e; p->next = NULL; q->rear->next = p; q->rear = p; return OK; }
4、出队操作
//出队操作 Status DeleteQueue(LinkQueue &q, ElemType &e){ QueuePtr p; if(q->front == q->rear) return ERROR; p = q->front->next; e = p->data; q->front->next = p->next; if( q->rear == p ) q->rear = q->front; free(p); return OK; }
5、销毁一个队列
//销毁一个队列 DestroyQueue(LinkQueue &q){ while( q->front ){ q->rear = q->front->next; free(q->front); q->front = q->rear; } return OK; }
二、队列的顺序存储
1、定义一个循环队列
//定义一个循环队列 #define MAXSIZE 100 typedef struct{ ElemType *base; //用于存放内存分配基地址 int front; int rear; };
2、初始化循环队列
//初始化循环队列 Status InitQueue(SqQueue &q){ q->base = (ElemType *)malloc(MAXSIZE*sizeof(ElemType)); if( !q->base ) exit(0); q->front = q->rear = 0; return OK; }
3、入队操作
//入队列操作 Status InsertQueue(SqQueue &q,ElemType e){ if( (q->rear+1)%MAXSIZE == q->front ) return ERROR; //队满 q->base[q->rear] = e; q->rear = (q->rear+1)%MAXSIZE; return OK; }
4、出队操作
//出队操作 Status DeleteQueue(SqQueue &q,ElemType &e){ if(q->front = q->rear) return ERROR; e = q->base[q->front]; q->front = (q->front+1)%MAXSIZE; return OK; }