一.队列的定义:
只允许一端插入,在另一端删除操作的线性表。允许插入操作的一端称为队尾,允许删除操作的一端称为队头。满足先进先出的特性。
二.队列的顺序存储结构。
队列的顺序存储结构也称为顺序队列。
我们约定front指向队头的前一个元素,rear指向队尾元素。随着元素的添加,数组会存满。但是当我们取出元素之后,低端还有空位置。这种现象叫做假溢出。我们解决的办法就是当存满之后,继续往下标最小的位置延续。这样的顺序队列,我们称为循环队列。
三.循环队列的实现
//存储结构定义
#define QueueSize 100
typedef int dataType;
typedef struct{
dataType data[QueueSize];
int front,rear;
}Queue;
//初始化
void initQueue(Queue *q){
q->front=q->rear=-1;
}
//入队
void push(dataType x,Queue * q){
if((q->rear+1)%QueueSize==q->front) throw "上溢异常";
q->rear=(q->rear+1)%QueueSize;
q->data[q->rear]=x;
}
//出队
dataType pop(Queue *q){
if(q->rear==q->front) throw "下溢异常";
q->front=(q->front+1)%QueueSize;
return q->data[q->front];
}
//取队头元素
dataType top(Queue * q){
if(q->front==q->rear) throw "下溢异常";
return q->data[(q->front+1)%QueueSize];
}
//判空
int empty(Queue * q){
if(q->front==q->rear) return 1;
else return 0;
}
四.队列的链接存储
图示:
代码部分:
#include<stdlib.h>
//定义存储结构
//头指针指向链队列的头结点,尾指针指向终端结点
typedef int dataType;
typedef struct Queue{
dataType data;
Queue * next;
}Queue;
//定义头尾指针
Queue * front,*rear;
//初始化
void initQueue(Queue *q){
front=rear=(Queue*)malloc(sizeof(Queue));
front=rear=NULL;
}
//入队
void push(dataType x){
Queue * node=(Queue*)malloc(sizeof(Queue));
node->data=x;
node->next=NULL;
rear->next=node;
rear=node;
}
//出队
dataType pop(){
if(rear==front) throw "下溢异常";
dataType x=front->next->data;
front->next=front->next->next;
if(front->next->next==NULL) rear=front;
return x;
}
//取队头元素
dataType top(){
if(rear==front) throw "下溢异常";
return front->next->data;
}
//判空
int empty(){
if(rear==front) return 1;
else return 0;
}
//队列的销毁
void destoryQueue(){
Queue * node,*temp;
node =front->next;
while(node !=NULL){
temp=node->next;
free(node);
node=temp;
}
}