当前位置:编程学习 > 网站相关 >>

数据结构--队列

队列是只允许在表的一端进行插入(队尾),在另一端进行删除(对头)的运算受限的线性表。
 
允许删除的一端称为对头(front),允许插入的一端称为队尾(rear)。
队列称为先进先出(First in first out)的线性表。
基本运算
InitQueue(Q)
构造一个空队列Qv
 
QueueEmpty(Q)
判断队空,若队列Q空,则返回true,否则返回false
 
QueueFull(Q)
判断队满,若队列为满,则返回true,否则返回false,此操作只适应线性表的队列。
 
EnQueue(Q,x)
入队,若队列Q非满,则将元素x插入Q的队尾。
 
DeQueue(Q)
出队,若队列Q非空,则删除Q的对头元素,并返回该元素。
 
QueueFront(Q)
若队列Q非空,则返回队头元素,注意不改变队列Q的状态。
 
 
队列必须使用一个变量保存队列的元素个数。
 
由于队列的对头和队尾的位置是变化的,因此我们设置两个指针front和rear分别指示对头元素和队尾元素在队列中的位置,他们的初值为0。
 
入队时将新元素插入到rear所指向的位置,然后将rear加1
 
出队的时候,返回front所指的元素,然后将front加1
 
在非空的队列中,头指针始终指向对头元素,而尾指针始终指向最后一个元素+1的位置。
 
循环队列的取模运算
i=(i+1)%QUEUESIZE;
 
顺序队
#define QUEUESIZE 100
typedef char DataType;
typedef struct
{
int nFront;      //头指针
int nRear;       //尾指针
int nCount;      //计数器
DataType data[QUEUESIZE];
}CirQueue;
 
初始化
void InitCQ(CirQueue *c)
{
        c->nCount=0;
        c->nFront=0;
        c->nRear=0;
}
判断队空
int QueueEmply(CirQueue *q)
{
return q->nCount==0;
}
判断队满
bool QueueFull(CirQueue *q)
{
return q->nCount==QUEUESIZE;
}
入队
bool EnQueue(CirQueue *p,DataType _data)
{
if(QueueFull(p))
return false;
p->nCount++;
p->data[p->nRear]=_data;
p->nRear=(p->nRear+1)%QUEUESIZE;
return true;
}
出队
bool DeQueue(CirQueue *p,DataType *data)
{
if(QueueEmpty(p))
return false;
*data=p->data[p->nFront];
        p->nFront=(p->nFront+1)%QUEUESIZE;
p->nCount--;
return true;
}
取队头元素
DataType QueueFront(CirQueue *p)
{
if(QueueEmpty(p))
return -1;
return p->data[p->nFront];
}
链队
typedef char DataType;
typedef struct Node
{
Datatype data;
struct Node *next;
}QueueNode;
typedef struct queue
{
QueueNode *front;
QueueNode *rear;
}LinkQueue;
 
初始化
void InitQueue(LinkQueue *Q)
{
Q->front=Q->rear=NULL;
}
 
判断队空
int QueueEmpty(LinkQueue *Q)
{
return Q->front==NULL;
}
 
入队
void EnQueue(LinkQueue *Q,DataType x)
{
QueueNode *p=(QueueNode *)malloc (sizeof(QueueNode));
p->data=x;
p->next=NULL;
if(QueueEmpty(Q))
Q->front=Q->rear=p;
else
{
Q->rear->next=p;
Q->rear=p;
}
}
 
出队
DataType DeQueue(LinkQueue *Q)
{
DataType x;
QueueNode *p;
if(QueueEmpty(Q))
return -1;
p=Q->front;
x=p->data;
Q->front=p->next;
if(Q->rear==p)
Q->rear=NULL;
free(p);
return x;
}
 
取队头元素
DataType QueueFront(LinkQueue *Q)
{
if(QueueEmpty(Q))
return -1;
return Q->front->data;
}
补充:综合编程 , 其他综合 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,