您的位置:

队列c语言,数组实现队列c语言

本文目录一览:

二级c语言,队列、循环队列是什么?

队列是一种特殊的线性表,循环队列是将向量空间想象为一个首尾相接的圆环。

1、队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。

2、循环队列是将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列。 在顺序队列中,当队尾指针已经到数组的上界,不能再有入队操作,但其实数组中还有空位置,这就叫做“假溢出”,解决假溢出的途径----采用循环队列。

扩展资料

判断队列满的情况:

1、count来计数;通常使用count

Count等于队列的MAXSIZE

2、Flag标志 int

入队列 flag=1 出队列flag=0

Front=rearflag==0

3、把一个存储单元空出来,不存放数据

Rear+1==front

注意事项:(不要) 顺序结构,SeqQueue myQueue;

参考资料来源:百度百科—循环队列

用C语言编写队列程序

#includestdio.h

#includestdlib.h

#includemalloc.h

#define TRUE 1

#define FALSE 0

#define NULL 0

#define OK 1

#define OVERFLOW 0

#define ERROR 0

typedef int QElemType;

typedef int Status;

typedef struct QNode

{

QElemType data;

QNode *next;

}*QueuePtr;

struct LinkQueue

{

QueuePtr front,rear;//队头,队尾指针

};

//函数列表

void InitQueue(LinkQueue Q)

{//初始化一个队列

Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));

if(!Q.front)//生成头结点失败

exit(OVERFLOW);

Q.front-next=NULL;

}

void DestoryQueue(LinkQueue Q)

{ //销毁队列

while(Q.front)

{

Q.rear=Q.front-next;//Q.rear指向Q.front的下一个结点

free(Q.front);//释放Q.front所指结点

Q.front=Q.rear;//Q.front指向Q.front的下一个结点

}

}

void ClearQueue(LinkQueue Q)

{ //将队列清为空

DestoryQueue(Q);//销毁队列

InitQueue(Q);//重新构造队列

}

Status QueueEmpty(LinkQueue Q)

{ //判断队列是否为空

if(Q.front-next==NULL)

return TRUE;

else return FALSE;

}

int QueueLength(LinkQueue Q)

{ //求队列的长度

int i=0;//计数器清0

QueuePtr p=Q.front;//p指向结点

while(Q.rear!=p)//p所指向的不是尾结点

{

i++;//计数器加1

p=p-next;

}

return i;

}

Status GetHead(LinkQueue Q,QElemType e)

{ //若队列不空,则用e返回队头元素

QueuePtr p;

if(Q.front==Q.rear) return ERROR;

p=Q.front-next;//p指向队头结点

e=p-data;//将队头元素的值赋给e

return OK;

}

void EnQueue(LinkQueue Q,QElemType e)

{ //插入元素e为队列Q的新的队尾元素

QueuePtr p;

p=(QueuePtr)malloc(sizeof(QNode));

//动态生成新结点

if(!p)

exit(OVERFLOW);

p-data=e;//将e的值赋给新结点

p-next=NULL;//新结点的指针为空

Q.rear-next=p;//原队尾结点的指针域为指向新结点

Q.rear=p;//尾指针指向新结点

}

Status DeQueue(LinkQueue Q,QElemType e)

{ //若队列不为空,删除Q的队头元素,用e返回其值

QueuePtr p;

if(Q.front==Q.rear)//队列为空

return ERROR;

p=Q.front-next;//p指向队头结点

e=p-data;//队头元素赋给e

Q.front-next=p-next;//头结点指向下一个结点

if(Q.rear==p)//如果删除的队尾结点

Q.rear=Q.front;//修改队尾指针指向头结点

free(p);

return OK;

}

void QueueTraverse(LinkQueue Q,void(*visit)(QElemType))

{ //对队头到队尾依次对队列中每个元素调用函数visit()

QueuePtr p;

p=Q.front-next;

while(p)

{

visit(p-data);//对p所指元素调用visit()

p=p-next;

}

printf("\n");

}

void print(QElemType e)

{

printf("%2d",e);

}

void main()

{

int i,k;

QElemType d;

LinkQueue q;

InitQueue(q);//构造一个空栈

for(i=1;i=5;i++)

{

EnQueue(q,i);

}

printf("栈的元素为:");

QueueTraverse(q,print);

k=QueueEmpty(q);

printf("判断栈是否为空,k=%d(1:为空9;0:不为空)\n",k);

printf("将队头元素赋给d\n");

k=GetHead(q,d);

printf("队头元素为d=%d\n",d);

printf("删除队头元素:\n");

DeQueue(q,d);

k=GetHead(q,d);

printf("删除后新的队头元素为d=%d\n",d);

printf("此时队列的长度为%d\n",QueueLength(q));

ClearQueue(q);//清空队列

printf("清空队列后q.front=%u,q.rear=%u,q.front-next=%u\n",q.front,q.rear,q.front-next);

DestoryQueue(q);

printf("销毁队列后,q.front=%u,q.rear=%u\n",q.front,q.rear);

c语言队列操作

pq-rear-next

=

pnew这个代码从队列的尾部增加新节点,

然后pq-rear

=

pnew更新队列尾部指针。队列的数据结构形式就是由一个头front指针,一个尾rear指针来表征,items的设计是用空间换时间,涉及队列大小的操作会非常方便。

队列的特征是先进先出,你给出的链式实现,其实就跟一个链表一样,链表的添加删除如果能理解了,队列只是链表的元素增加/删除

按先进先出特点的一种实现。

但对于队列来说,实现方式不是重点,先进先出的性质才是重点,这在实际应用中很多,比如排队叫号。

C语言中,队列是什么意思,有什么用途

队列是一种特殊的线性表。

队列一种可以实现“先进先出”的存储结构,即“一端入,一端出”,队首(front)出队,队尾(rear)入队,若front指向队首,则rear指向队尾最后一个有效元素的下一个元素;若rear指向队尾,则front指向队首第一个有效元素的下一个元素。

队列特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

扩展资料

循环队列各个参数的含义

1、队列初始化front和rear的值都是零,初始化时队列就是空的。

2、队列非空front代表队列的第一个元素rear代表了最后一个有效元素的下一个元素。

3、队列空front和rear的值相等,但是不一定是零。

参考资料来源:百度百科—队列