目录
一、队列
1.1定义
一种受限的线性表,只允许在一端插入,另一端删除,插入元素称入队或者进队、删除元素称出队或者离队
#define MaxSize 50
typedef struct {
itn data[MaxSize]; //存放队列元素
int front,rear; //队头指针和队尾指针
}SqQueue;
*1.2操作
常见操作
InitQueue(&Q):初始化队列,构造一个队列
初始状态:Q.front==Q.rear==0
QueueEmpty(Q):判断是否空,空true,不空false
Q.front==Q.rear
EnQueue(&Q,x):入队。未满,加入队尾
Q.data[Q.front++]=x
DeQueue(&Q,&x):出队。非空,删除队头元素。返回x
Q.data[Q.rear++]
GetHead(Q,&x):读取队头元素,使用x返回
Q.data[Q.front]
二、循环队列
2.1定义
把存储队列元素的表逻辑上视为一个环,称循环队列
*2.2操作
入队:Q.front=(Q.front+1)%MaxSize
出队:Q.rear=(Q.rear+1)%MaxSize
队满条件:(Q.rear+1)%MaxSize==Q.front
队空:Q.front==Q.rear
队元素个数:(Q.rear-Q.front+MaxSize) % MaxSize
三、队列链式存储
3.1定义
一个同时带有队头指针和队尾指针的单链表
typedef struct LinkNode{ //链式队列结点
int data;
struct LinkNode *next;
}LinkNode
typedef struct { //链式队列
LinkNode *front,*rear; //链队的队头和队尾指针
}LinkQueue;
入队
bool EnQueue(LinkeQueue Q,int x){
LinkNode *S=(LinkNode *)malloc(sizeof(LinkNode));
s->data=x;
s->next=Null;
Q.rear->next=s;
Q.rear=s;
}
出队
bool DeQueue(LinkQueue &Q,int 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
}
四、双端队列
指允许两端都可以入队和出队的队列
还可以有其他情况
输入受限
输出受限
*题
注意,一条隧道里面同时能有多条火车前后进入,当出的次序的1~9,所以每条隧道的火车序号必选队头小于队尾