复习:队列

1.队列的定义

队列是限制结点插入操作固定在一端进行,而结点的删除操作固定在另一端进行的线性表.
队列犹如一个两端开口的管道.允许插入的一端称为队头,允许删除的一端称为队尾.队头和队尾各用一个”指针”指示,称为队头指针和队尾指针.不含任何结点的队列称为”空队列”.队列的特点是结点在队列中的排队次序和出队次序按进队时间先后确定,即先进队者先出队.因此,队列又称先进先出表.简称FIFO(first in first out)表.

队列的操作
(1)向队列中插入新元素称为进队或入队,新元素进队后就成为新的队尾元素;
(2)从队列中删除元素称为出队或离队,元素出队后,其后继元素成为队首元素。
特点:先进先出

顺序队列

队空条件:front=rear
队满条件:rear=Maxsize-1
元素e进队:rear++;data[rear]=e;
元素e出队:front++;e=data[front];

rear指向队尾元素,front指向队头元素的前一个位置

初始化队列

构造空队列 将front和rear指针均设置成初始状态即-1
//初始化
void InitQueue(SqQueue *&q)
{
q=(SqQueue *)malloc(sizeof(SqQueue));
q->front=q->rear=-1;
}

//销毁队列

void DestroyQueue(SqQueue *&q)
{
free(q);
}

//判断队列是否为空

bool QueueEmpty(SqQueue *&q)
{
return (q->front==q->rear);
}

//进队列

bool EnQueue(SqQueue *&q,ElemType e)
{
if(q->rear==Maxsize-1)
return false;
q->rear++;
q->data[q->rear]=e;
return true;
}

//出队列

bool deQueue(SqQueue *&q,ElemType &e)
{
if(q->front==q->rear)
return false;
q->front++;
e=q->data[q->front];
return true;
}

环形队列

环形队列原理:内存上没有环形的结构,因此环形队列实上是数组的线性空间来实现。那当数据到了尾部如何处理呢?它将转回到0位置来处理。这个的转回是通过取模操作来执行的。 因此环列队列的是逻辑上将数组元素q[0]与q[MAXN-1]连接,形成一个存放队列的环形空间。为了方便读写,还要用数组下标来指明队列的读写位置。

队空条件:front=rear
队满条件:(rear+1)%Maxsize=front //只存储Maxsize-1个元素
进队操作:rear=(rear+1)%Maxsize
出队操作:front=(front+1)%Maxsize

循环队列和普通队列的初始化 销毁 判断为空是一致的

//循环队列
//初始化
void InitQueue1(SqQueue *&q)
{
q=(SqQueue *)malloc(sizeof(SqQueue));
q->front=q->rear=0;
}

//销毁队列
void DestroyQueue1(SqQueue *&q)
{
free(q);
}

//判断队列是否为空
bool QueueEmpty1(SqQueue *&q)
{
return (q->front==q->rear);
}

循环队列进队列

进队列
bool EnQueue1(SqQueue *&q,ElemType e)
{
if((q->rear+1)%Maxsize==q->front)
return false;
q->rear=(q->rear+1)%Maxsize;
q->data[q->rear]=e;
return true;
}

循环队列出队列

//出队列
bool deQueue1(SqQueue *&q,ElemType &e)
{
if(q->front==q->rear)
return false;
q->front=(q->front+1)%Maxsize;
e=q->data[q->front];
return true;
}

链队

组成
(1)存储队列元素的单链表
(2)指向队头和队尾指针的链队头节点

队空条件:front=rear=NULL
队满条件:不考虑 不存在溢出
进队e操作:将包含e的节点插入单链表表尾
出队操作:删除单链表的头结点

初始化队列

构造一个空队列 即只创造一个链队的头结点,其front和rear均设置为NULL 不创建数据元素节点
//初始化
void InitQueue(LiQueue *&q)
{
q=(LiQueue*)malloc(sizeof(LiQueue));
q->front=q->rear=NULL;
}

//销毁

void DestroyQueue(LiQueue *&q)
{
QNode *p=q->front,*r;
if(p!=NULL)
{
r=p->next;
while(r!=NULL)
{
free(p);
p=r;
r=p->next;
}

}
free(p);
free(q);

}

//判断队列是否为空

bool QueueEmpty(LiQueue *q)
{
return (q->rear=NULL);

}

//入队

//入队
void enQueue(LiQueue *&q,ElemType e)
{
QNode *p;
p=(QNode*)malloc(sizeof(QNode));
p->data=e;
p->next=NULL;

if(q->rear==NULL)
{
    q->front=q->rear=p;
}
else
{
    q->rear->next=p;
    q->rear=p;
}

}
}

出队列

(1)若原队列不为空,则将第一个数据节点的data域赋给e并且删除之
(2)若出队之前队列中只有一个节点,则将链队节点的两个域均设置为NULL,表示链队已空

//出队
bool deQueue(LiQueue *&q,ElemType &e)
{
QNode *t;
if(q->rear=NULL)
return false;
t=q->front;
if(q->front==q->rear)
q->front=q->rear=NULL;
else
q->front=q->front->next;

e=t->data;
free(t);
return true;

}

//入队

void enQueue(LiQueue *&q,ElemType e)
{
QNode *p;
p=(QNode*)malloc(sizeof(QNode));
p->data=e;
p->next=NULL;

if(q->rear==NULL)
{
    q->front=q->rear=p;
}
else
{
    q->rear->next=p;
    q->rear=p;
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值