目录
🌺队列的定义
队列与生活中的排队一样,最早排队的最先离开。
队列有两种存储表示,顺序表示与链式表示
🌺队列的顺序表达与实现
🌷队列顺序存储结构
和顺序栈相类似,在队列的顺序存储结构中,除了用一组地址连续的存储单元依次列头到队列尾的元素之外,尚需附设两个整型变量【front】和【rear】分别指示队列头元素及队间的位置(后面分别称为头指针和尾指针)。
队列的顺序存储结构表示如下:
#define MAXSIZE 100 //队列容量
typedef struct
{
ElemType *base; //存储空间
int front,rear; //队首,队尾
}SqQueue ;
🌷假溢出
如何解决循环链表的这一缺点呢?
🌷循环队列
将顺序队列臆造成一个环状的空间,即把存储队列元素的表从逻辑上视为一个环,称为循环队列。
🌹循环队列的初始化
循环队列的初始化就是动态分配一个预定义大小为 MAXSIZE 的数组空间
🔺实现原理
💬 代码演示
Status InitQueue ( SqQueue &Q )
{
Q.base=new ElemType[MAXSIZE];
if(!Q.base) return OVERFLOW;
Q.front=Q.rear=0;
return OK;
}
🌹循环队列的入队
入队操作是指在队尾插入一个新的元素
🔺实现原理
💬 代码演示
Status EnQueue(SqQueue &Q,ElemType e)
{
if((Q.rear+1)%MAXSIZE==Q.front) //判满
return ERROR;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXSIZE;
return OK;
}
🌹循环队列的出队
出队操作是删除队头元素
🔺实现原理
💬 代码演示
Status DeQueue(SqQueue &Q, ElemType &e)
{
if( Q.rear==Q.front )
return ERROR; //判空
e = Q.base[Q.front];
Q.front = (Q.front+1)%MAXSIZE;
return OK;
}
🌷链队列
队列的链式表示称为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表,头指针指向对头结点,尾指针指向队尾结点。
队列的链式存储如图:
队列的链式存储类型可描述为:
typedef struct Qnode
{
ElemType data;
struct QNode * next;
}Qnode,*QueuePtr; //结点
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue; //链队
🌹链栈的初始化
链栈的初始化操作就是构建一个只有头结点的空队。
🔺实现原理
💬 代码演示
Status InitQueue(LinkQueue &Q)
{
Q.front=Q.rear=new QNode;
p->next=NULL;
return OK;
}
🌹链栈的入队
🔺实现原理
💬 代码演示
Status EnQueue(LinkQueue &Q,ElemType e)
{
p=new QNode; //为入队元素分配结点空间,用指针p指向
p->data=e; //将新结点数据域置为e
p->next=NULL;
Q.rear->next=p; //将新结点插入到队尾
Q.rear=p; //修改队尾指针为p
return OK;
}
🌹链栈的出队
🔺实现原理
💬 代码演示
Status DeQueue(LinkQueue &Q,ElemType &e)
{
if(Q.front==Q.rear) //若队列为空,返回ERROR
return ERROR;
QNode *p=Q.front->next; //保留头元素空间,以备释放
Q.front->next=p->next; //修改头指针的指针域,指向下一结点
if(Q.rear==p) //判断出队元素是否是最后一个元素,若是,将队尾指针重新赋值,指向头结点
Q.rear=Q.front;
delete p; //释放原队头元素的空间
return OK;
}