1.也是操作受限的线性表,只允许在一端进行插入,另一端进行删除。
特性:先进先出(FIFO)。
2.1队列的顺序储存:分配一块连续的存储单元存放元素,队头指针front指向队头元素,队尾指针rear指向队尾元素的下一个位置。
#define MaxSize 50
typedef struct{
ElemType data[MaxSize];
int front,rear;
}SqQueue;
初始状态:即队空时,Q.front==Q.rear==0
进队:先判断队是否满,不满则送到队尾元素,再队尾指针加1。
出队:先判断队是否空,不空则取队头元素值,再队头指针加1。
2.2循环队列:将队列从逻辑上视为环,可以避免假溢出。
初始化:Q.front==Q.rear==0
队首指针进1:Q.front=(Q.front+1)%MaxSize
队尾指针进1:Q.rear=(Q.rear+1)%MaxSize
队首指针进1:Q.rear+MaxSize-Q.front)%MaxSize
区分队满和队空的方法
(1)牺牲一个存储单元,令队头指针在队尾指针的下一个位置作为队满。
队满:(Q.rear+1)%MaxSize==Q.front
队空:Q.front==Q.rear
(2)增加一个数据表示元素个数
队满:Q.size==MaxSize
队空:Q.size==0
(3)增加一个tag数据
队满:tag=1 Q.front==Q.rear
队空:tag=0 Q.front==Q.rear
初始化
//初始化
void InitQueue(SqQueue &Q){
Q.rear=Q.front=0;
}
//判断队空
bool isEmpty(SqQueue Q){
if(Q.rear==Q.front) return true;
else return false;
}
//入队
bool EnQueue(SqQueue &Q,ElemType x){
if((Q.rear+1)%MaxSize==Q.front) return false;
Q.data[Q.rear]=x;
Q.rear=(Q.rear+1)%MaxSize;
return true;
}
//出队
bool DeQueue(SqQueue &Q,ElemType &x){
if(Q.rear=Q.front) return false;
x=Q.data[Q.front];
Q.front=(Q.front+1)%MaxSize;
return true;
}
3.队列的链式储存:实际上是带有队头指针,队尾指针的单链表。
队头指针指向队头节点,队尾指针指向队尾节点。
//储存类型说明
typedef struct{
ElemType data;
struct LinkNode *next;
}LinkNode;
typedef struct{
LinkNode *front,*rear;
}LinkQueue;
//初始化
void InitQueue(LinkQueue &Q){
Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));
Q.front->next=NULL;
}
//判断队空
bool IsEmpty(LinkQueue Q){
if(Q.front==Q.rear) return true;
elsereturn false;
}
//入队
void EnQueue(LinkQueue &Q,ElemType x){
LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=x;
s->next=NULL;
Q.rear->next=s;
Q.rear=s;
}
//出队
bool DeQueue(LinkQueue &Q,ElemType &x){
if(Q.front==Q.rear) return true;
LinkNode *p=Q.front->next;
x=p->data;
Q.front->next=p->next;
if(Q.rear==p)
Q.rear=Q.front;
free(p);
return true;
}
4.双端队列:允许双端进行插入删除操作。