队列简称队,它也是一种操作受限的线性表,其限制为仅允许在表的一端进行插入操作,而在表的另一端进行删除操作。
把队列的结构类型定义及其基本算法做成头文件
头文件(如果把头文件和程序代码都放在一个工程里,则头文件不能用< >(只有系统头文件才能用),在工程里面的头文件,在主程序调用时,用“”)
顺序环队列
//
typedef int ElemType;
typedef struct
{
ElemType date[MaxSize];//存放队中元素
int front,rear;//队头和队尾指针
}SqQueue;//环队类型
//队空的条件:q->front=q->rear;
/**************初始化队列****************/
void chushihua(SqQueue *&q)
{//构造一个空队列q,将front和rear指针均设置成初始状态,即-1值
q=(SqQueue *)malloc(sizeof(SqQueue));
q->front=q->rear=0;
}
/*************销毁队列******************/
void xiaohui(SqQueue *&q)
{//释放q占用的存储空间
free(q);
}
/**************判断队列是否为空**********/
bool panduanshifouweikong(SqQueue *q)
{//为空返回真,否则返回假
return(q->front==q->rear);
}
/**************进队列*******************/
bool jinduilie(SqQueue *&q,ElemType e)
{
if((q->rear+1)%MaxSize==q->front)//队满上溢出
return false; //返回假
q->rear=(q->rear+1)%MaxSize;//队尾增1
q->date[q->rear]=e;//rear位置插入元素e
return true;//返回真
}
/**************出队列*********************/
bool chuduilie(SqQueue *&q,ElemType &e)
{
if(q->front==q->rear)//队空下溢出
return false;
q->front=(q->front+1)%MaxSize;
e=q->date[q->front];
return true;
}
链式队列
#include
typedef int ElemType;
typedef struct qnode
{
ElemType date;//存放元素
struct qnode *next;//队头和队尾指针
}DataNode;//链队数据结点的类型
typedef struct
{
DataNode *front;//指向队首指针
DataNode *rear;//指向队尾指针
}LinkQuNode;//链队结点的类型
//队空的条件 :q->rear==NULL(也可以为q->front==NULL)
//元素e的进队操作:新建一个结点存放元素e(由p指向它),将结点p插入作为尾结点
//出队操作:取出队首结点的data值并将其删除
/**************初始化队列****************/
void chushihua(LinkQuNode *&q)
{
q=(LinkQuNode *)malloc(sizeof(LinkQuNode));
q->front=q->rear=NULL;
}
/*************销毁队列******************/
void xiaohui(LinkQuNode *&q)
{
DataNode *pre=q->front,*p;//pre指向队首结点
if (pre!=NULL)
{
p=pre->next;//p指向结点pre的后继结点
while (p!=NULL)//p不空循环
{
free(pre);//释放pre结点
pre=p;p=p->next;//pre,p同步后移
}
free(pre);//释放最后一个数据结点
}
free(q);//释放链队结点
}
/**************判断队列是否为空**********/
bool panduanshifouweikong(LinkQuNode *q)
{//为空返回真,否则返回假
return(q->rear==NULL);
}
/**************进队列*******************/
bool jinduilie(LinkQuNode *&q,ElemType e)
{
DataNode *p;
p=(DataNode *)malloc(sizeof(DataNode));//创建新结点
p->date=e;
p->next=NULL;
if (q->rear==NULL) //若链队为空,则新结点既是队首又是队尾结点
{
q->front=q->rear=p;
}
else //若链队不空
{
q->rear->next=p;//将结点p链到队尾,并将rear指向它
q->rear=p;
}
}
/**************出队列*********************/
bool chuduilie(LinkQuNode *&q,ElemType &e)
{
DataNode *t;
if(q->rear==NULL)//原来队列为空
return false;
t=q->front;//t指向首节点
if (q->front==q->rear)//原来队列中只有一个数据结点时
q->front=q->rear=NULL;
else //原来队列中有两个或两个以上结点时
q->front=q->front->next;
e=t->date;
free(t);
return true;
}
通过下面这个运用队列的例子,可以加深印象
利用队列求解报数问题。设有n个人站成一排,从左向右的编号分别为1~n,现在从左往右报数“1,2,1,2,…”,数到“1”的人出列,数到“2”的立即站到队伍的最右端。报数过程反复进行,直到n个人都出列为止。要求给出他们的出列顺序。
#include
#include
void number(int n)
{
int i;
ElemType e;
SqQueue *q;//环形队列指针q
chushihua(q);//初始化队列q
for (i=1;i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?