这是我参与更文挑战的第13天,活动详情查看:更文挑战
队列
只允许在表的一端插入另一端删除。
队头:允许删除的一端 队首
队尾:允许插入的一端
常见操作:初始化 判队列空 入队 出队 读对头元素
队列的顺序表示
队头指针指向队头元素,队尾指针指向队尾元素的下一个位置
#define MaxSzie 50
typedef struct{
Elemtype data[MaxSize];
int front ,rear;
}SqQueue;
- 初始状态:Q.front == Q.rear == 0
- 进队操作:队不满时,先送值到队尾元素,再将队尾指针加1
- 出队操作:队不空时,先取队头元素值,再将队头指针加1
循环队列
- 初始时:Q.front = Q.rear = 0
- 队首指针进1 :Q.front = (Q.front + 1) %MaxSize
- 队尾指针进1: Q.rear = (Q.rear + 1)%MaxSize
- 队列长度: (Q.rear + MaxSize - Q.front)% MaxSize
类型中增设表示元素元素个数的数据成员
- 队空条件:Q.sise == 0
- 队满条件:Q.size == MaxSize
两者均有 Q.rear == Q.front
类型中增设tag数据成员,tag==0时,若因为删除使Q.front == Q.rear 队空;tag == 1时,若因为插入使Q.front == Q.rear 队满
//初始化
void InitQueue(SqQueue &Q){
Q.rear = Q.front = Q;
}
//判断队列为空
bool isEmpty(SqQueue Q){
if(Q.rear == Q.front) return true;
return false;
}
//入队
bool EnQueue(SqQueue &s,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 &s,Elemtype x){
if(Q.rear == Q.front)return false;
//有问题 队满时没法用
x= Q.data[Q.front];
Q.front = (Q.front+1)%MaxSize;
return true;
}
队列的链式存储
链式特别适合用在数据元素数量很大的时候
一个同时具有队头指针和队尾指针的单链表
typedef struct{
Elemtype data;
struct LinkeNode *next;
}LinkNode;
typedef struct{
LinkNode *front,*rear;
}LinkQueue;
当Q.front ==NULL
且Q.rear ==NULL
时,链式队列为空
- 出队时,首先判断队是否为空,若不空则取出队头元素,并让Q.front指向下一个节点
- 若该结点为最后一个结点,则置Q.front Q,rear均为NULL
- 入队时,建立一个新结点插入,并让Q.rear指向新结点
- 若原队列为空,让Q,front指向新结点
很麻烦!,加一个头结点
//初始化
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;
return 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 false;
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;
}
双端队列
两端都可以入队和出队操作
输出受限的双端队列:允许一端插入和删除,只允许另一端插入