队列(Queue)是只允许在一端进行插入,在另一端删除的线性表
插入:入队 删除:出队
重要术语: 队头:允许删除的一端 队尾:允许插入的一端 空队列
InitQueue(&Q);
DestroyQueue(&Q);
EnQueue(&Q,x);
DeQueue(&Q,&x);
Get(Q,&x);
顺序存储队列
定义
#define MaxSize 10
typedef struct {
ElemType data[MaxSize];
int front,rear;
}SqQueue;
初始化
void InitQueue(SqQueue &Q){
Q.front = Q.rear = 0;
}
入队
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;
}
获取队头元素的值
bool Get(SqQueue Q,ElemType &x){
if(Q.rear == Q.front){
return false;
}
x = Q.data[Q.front];
return true;
}
判断队列已满/已空(重点)
队列已满条件:队尾指针再下一个位置是队头。
(Q.rear+1)%MaxSize == Q.front
队空条件:
Q.rear == Q.front
链式存储队列
定义
typedef struct LinkLNode{
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;
}else{
return false;
}
}
或者
bool IsEmpty(LinkQueue Q){
if(Q.front->next = NULL){
return true;
}else{
return false;
}
}
初始化(带头节点)
void InitQueue(LinkQueue &Q){
Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));
Q.front = Q.rear = NULL;
}
判空
bool IsEmpty(LinkQueue Q){
if(Q.front = NULL){
return true;
}else{
return false;
}
}
入队(带头节点)
bool EnQueue(LinkQueue &Q,ElemType x){
LinkNode *s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = x;
s->next = NULL;
Q.rear->next = s;
Q.rear = s;
return true;
}
入队(不带头节点)
bool EnQueue(LinkQueue &Q,ElemType x){
LinkNode *s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = x;
s->next = NULL;
if(Q.front == NULL){
Q.front = s;
Q.rear = s;
}else{
Q.rear->next = s;
Q.rear = s;
}
return true;
}
出队(带头节点)
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;
}
出队(不带头节点)
bool DeQueue(LinkQueue &Q,ElemType &x){
if(Q.front == NULL){
return false;
}
LinkNode *p = Q.front;
x = p->data;
Q.front = p->next;
if(Q.rear == p){
Q.rear = Q.front = NULL;
}
free(p);
return true;
}
队列满的条件
一般不会队满,比顺序存储要好
双端队列(考察过)
双端队列:只允许从两端插入,两端删除的线性表
输入受限的双端队列
只允许从一端插入、两端删除的线性表
输出受限的双端队列
只允许从两端插入、一端删除的线性表
考点:判断输出序列的合法性
输入序列为1,2,3,4 合法性(栈、队列)
输入受限的双端队列,栈中合法,双端队列一定合法。
输出受限的双端队列,栈中合法,双端队列一定合法。
|