主要代码为顺序实现、链式实现,双端队列需要理解并用于解题。
一、顺序实现
#include <stdio.h>
#define max 10
typedef struct sqqueue{
int data[max];
int front,rear;
}sqqueue;
bool initqueue(sqqueue &q){
q.rear=q.front=0;
}//此步骤初始化;
bool queueempty(sqqueue &q){
if(q.rear==q.front){
return true;
}
else{
return false;
}
}//此步骤判断是否为空
bool enqueue(sqqueue &q,int e){
if((q.rear+1)%max==q.front){
return false;
}
q.data[q.rear]=e;
q.rear=(q.rear+1)%max;
return true;
}//入队操作,可以说队列的精髓之处,就是判满条件,这个条件使队列变成了一个环
bool dequeue(sqqueue &q,&int x){
if(q.rear==q.front){
return false;
}
x=q.data[q.front];
q.front++;
return true;
}//出队操作
//下面是三种判断队满的条件
1、上面的方法,注意下图计算个数
2、size变量,入队++,出队–
3、tag变量,方法如下图
4、注意当题目给rear指向当前元素而非下一个时操作不同,并且这种情况下无法判满,必须采用2、3方法
二、链式实现
//带头结点
//需要定义两个结构体
typedef struct linknode{
int data;
struct linknode *next;
}linknode;
typedef struct linkqueue{
linknode *rear,*front;
}linkqueue;
bool initqueue(linkqueue &q){
q.rear=q.front=(linknode *)malloc(sizeof(linknode));
q.front->next=NULL;
}//初始化不同,判空操作相同
void enqueue(linkqueue &q,int e){
linknode *s=(linknode *)malloc(sizeof(linknode));
s->data=e;
s->next=NULL;//不带头结点时需要多一步判定表是否为空
//if(q.front==NULL){q.front=s;q.rear=s}
//else{q.rear->next=s;q.rear=s;}
q.rear->next=s;
q.rear=s;
}//入队
bool dequeue(linkqueue &q,int &e){
if(queueempty(q)){
return false;
}
linknode *p=q.front->next;//注意第一次没想明白,这里是有头结点的
//所以q.front指的是头结点,->next指的是要删的结点,同时注意front
//永远指向头结点。如果不带头结点p=front
x=p->data;
q.front->data=p->next;
if(q.rear==p){
q.rear=q.front;
}//最后一个结点时操作,如果不带头结点则应该写q.rear=null;q.front=null
free(p);
return true;
}//出队
三、双端队列
考试多填空选择,放几个图以供参考
1、栈的结论(注意栈能实现的顺序,双端队列一定能实现)
2、输入受限
3、输出受限