3.2.1队列的定义
3.2.1队列的定义






3.2.2 队列的顺序实现

#define MaxSize 10//定义队列中元素的最大个数
typedef struct{
ElemType data[MaxSize];//用静态数组存放队列元素
int front,rear;//队头指针和队尾指针
}SqQueue;
void InitQueue(SqQueue &Q){
//初始时 队头队尾指针指向0
Q.rear=Q.front=0;
}
void testQueue(){
//声明一个队列 (顺序存储)
SqQueue Q;
InitQueue(Q);
//...后续操作...
}
//判断队列是否为空
bool QueueEmpty(SqQueue Q){
if(Q.rear==Q.front)//队空条件
return true;
else
return false;
}


入队操作
#define MaxSize 10//定义队列中元素的最大个数
typedef struct{
ElemType data[MaxSize];//用静态数组存放队列元素
int front,rear;//队头指针和队尾指针
}SqQueue;
//入队
bool EnQueue(SqQueue &Q,Elemtype x){
if(队列已满)
return false;//队满则报错
Q.data[Q.rear]=x;//新元素插入队尾
Q.rear=QQ.rear+1%MaxSize;//队尾指针加1取模
return true;
}




判断队列已满/已空








3.2.3队列的链式实现

typedef struct LinkNode{//链式队列结点
ElemTpye data;
struct LinkNode *next;
}LinkNode;
typedef struct{//链式队列
LinkNode *front,*rear;//队列的队头和队尾指针
}LinkQueue;

typedef struct LinkNode{//链式队列结点
ElemTpye data;
struct LinkNode *next;
}LinkNode;
typedef struct{//链式队列
LinkNode *front,*rear;//队列的队头和队尾指针
}LinkQueue;
//初始化队列(带头结点)
void InitQueue(LinkQueue &Q){
//初始时 front、rear 都指向头节点
Q.front = Q.rear = (LinkNode *)malloc(sizeof(LinkNode));
Q.front->next=NULL;
}
void testLinkQueue(){
LinkQueue Q;//声明一个队列
InitQueue(Q);//初始化队列
//...后续操作...
}
//判断队列是否为空
bool IsEmpty(LinkQueue Q){
if(Q.front==Q.rear)
return true;
else
return false;
}

初始化(不带头节点)
void InitQueue(LinkQueue &Q){
//初始时 front、rear 都指向头节点
Q.front = NULL;
Q.rear = NULL;
}
//判断队列是否为空(不带头节点)
bool IsEmpty(LinkQueue Q){
if(Q.front==NULL)
return true;
else
return false;
}

入队(带头节点)
//新元素入队(带头结点)
void EnQueue(LinkQueue &Q,ElemType x){
LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=x;
s->next=NULL;
Q.rear->next=S;//新结点插入到rear之后
Q.rear=s;//修改表尾指针
}

//新元素入队(不带头结点)
void 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;//新结点插入到rear结点之后
Q.rear=s;//修改rear指针
}
}

出队(带头结点)
//队头元素出队(不带头结点)
bool DeQueue(LinkQueue &Q,ElemType &x){
if(Q.front==Q.rear)
return false;//空队
LinkNode *p=Q.front->next;
x=p->data;//用变量x返回结点的next指针
Q.front->next=p->next;//修改头结点的next指针
if(Q.rear==p)//此次是最后一个结点出队
Q.rear=Q.front;//修改rear指针
free(p);//释放结点空间
return true;
}

出队(不带头结点)
//队头元素出队(不带头结点)
bool DeQueue(LinkQueue &Q,ElemType &x){
if(Q.front==NULL)
return false;//空队
LinkNode *p = Q.front;//p指向此次出队的结点
x=p->data;//用变量x返回队头元素
Q.front = p->next;//修改front指针
if(Q.rear == p){//此次是最后一个结点对队
Q.front = NULL;//front 指向NULL
Q.rear =NULL;//rear指向NULL
}
free(p);//释放结点空间
return true;
}



3.2.4双端队列







浙公网安备 33010602011771号