队列的基本操作以及应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五队列的基本操作及应用
实验目的:掌握队列的初始化、判空、取队头元素、出队、入队、输出队列元素等基本操作实验要求:
1、认真阅读和掌握教材上和本实验相关的算法。
2、实现链队列的相关算法,并能够进行简单的输入输出验证。
实验内容:
编程实现链队列的基本操作,这些基本操作至少包括:初始化、清空、判空、取队头元素、出队、入队、输出队列元素。要求能够进行简单的输入输出验证。
参考代码
#include
#include
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define MAXQSIZE 6 /* 最大队列长度(对于循环队列,实际队列数据个数要减1) */ typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等*/
typedef struct //声明QElemType类型,此处即为C的整型
{
int StudentNo;
char name[5];
int fenshu;
}QElemType;
//定义循环队列结构
typedef struct
{
QElemType *base; /* 初始化的动态分配存储空间*/
int front; /* 头指针,若队列不空,指向队列头元素*/
int rear; /* 尾指针,若队列不空,指向队列尾元素的下一个位置*/
}SqQueue;
//基本操作
Status InitQueue(SqQueue &Q)
{ /* 构造一个空队列Q */
Q.base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
if(!Q.base) /* 存储分配失败*/
return ERROR;
Q.front=Q.rear=0;
return OK;
}
Status DestroyQueue(SqQueue &Q)
{ /* 销毁队列Q,Q不再存在*/
if(Q.base)
free(Q.base);
Q.base=NULL;
Q.front=Q.rear=0;
return OK;
}
Status QueueEmpty(SqQueue Q)
{ /* 若队列Q为空队列,则返回TRUE,否则返回FALSE */
if(Q.front==Q.rear) /* 队列空的标志*/
return TRUE;
else
return FALSE;
}
int QueueLength(SqQueue Q)
{ /* 返回Q的元素个数,即队列的长度*/
return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}
Status GetHead(SqQueue Q,QElemType &e)
{ /* 若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR */ if(Q.front==Q.rear) /* 队列空*/
return ERROR;
e=*(Q.base+Q.front);
return OK;
}
Status EnQueue(SqQueue &Q,QElemType e)
{ /* 插入元素e为Q的新的队尾元素*/
if((Q.rear+1)%MAXQSIZE==Q.front) /* 队列满*/
return ERROR;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
printf("-------------------------------\n");
printf("入队元素的学号为:%d:\n",e.StudentNo);
printf("入队元素的姓名为:%s:\n",);
printf("入队元素的分数为:%d:\n",e.fenshu);
return OK;
}
Status DeQueue(SqQueue &Q,QElemType &e)
{ /* 若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR */ if(Q.front==Q.rear) /* 队列空*/
return ERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
printf("-------------------------------\n");
printf("出队元素的学号为:%d:\n",e.StudentNo);
printf("出队元素的姓名为:%s:\n",);
printf("出队元素的分数为:%d:\n",e.fenshu);
return OK;
}
Status ShowQueue(SqQueue Q)
{ //依次显示每个队列空间及当前队头、队尾位置
int i=0;
for(i=0;i { printf("[%d]: %d",i,Q.base[i]); if (Q.front==i) printf(" ->Head"); if (Q.rear==i) printf(" ->Tail"); printf("\n"); } return OK; } //主函数 void main() { QElemType student[6]={{001,"张三",90},{002,"李四",95},{003,"王五",82},{004,"赵六",92},{005,"钱四",94},{006,"孙伟",79}}; SqQueue Q; InitQueue(Q); QElemType j; for(int k=1;k<=6;k++) { j=student[k-1]; EnQueue(Q,j); } printf("显示队列的各个元素:\n"); int p; QElemType e; p=Q.front; while(Q.front!=Q.rear) { DeQueue(Q,e); } DestroyQueue(Q); printf("队列已经销毁:\n"); }