[教学设计]队列的定义及基本操作
附件2:
北京理工大学珠海学院实验报告
ZHUHAI CAMPAUS OF BEIJING INSTITUTE OF TECHNOLOGY
实验题目 队列的定义及基本操作 实验时间
一、实验目的、意义
(1)掌握对列的定义和基本操作,熟练掌握循环队列的操作及应用, 掌握循环队列的入队和出队等基本操作。
(2)加深对队列结构的理解,逐步培养解决实际问题的编程能力
二、实验内容及要求
说明1:学生在上机实验时,需要自己设计出所涉及到的函数,同时设计多组输入数据并编写主程序分别调用这些函数,调试程序并对相应的输出作出分析;修改输入数据,预期输出并验证输出的结果,加深对有关算法的理解。
具体要求:
定义循环队列,完成队列的基本操作:入队和出队等。 (参见教材59页)
三、实验所涉及的MATCH_
word
word文档格式规范word作业纸小票打印word模板word简历模板免费word简历
_1716062657498_0
队列的操作特点是“先进先出”。前者主要是头指针、尾指针的使用,后者主要是理解循环队列提出的原因及其特点。两者都要掌握队列空与满的判定条件以及出队列、入队列操作的实现。
四、实验记录
数据结构的算法一般需修改才能在C环境下运行,如算法中采用了C++语言的引用参数,需作修改:将C++函数形参表中以&打头的参数改成以*打头的参数,再在函数体该参数前加*即可。
五、实验结果及分析 主菜单
入队
打印输出当前队列
打印输出当前队列头元素
出队
六、总结与体会
在这次实验中,我没有在上机课的时间内按时完成,我从中发现了自己有许多的不足之处,很多内容老师在上课的时候讲过,没有认真听,所以编的程序经常出差。碰到问题就参考百度或问同学,没有自己的主见。C语言的知识还不够熟练,平时缺少练习。其实还有许多不足之处,这次实验让我更意识到了学习的重要性,不能学了新科目的知识就忘了以前学过的科目的知识。 七、程序清单(包含注释)
#include
#include
#define true 1
#define false 0
#define Size 50
//队列的数据结构
typedef struct
{
int element[Size];//队列的元素空间
int front;//头指针指示器
int rear;//尾指针指示器
int count;//计数器,记录队中元素总数 }SeqQueue;
//函数声明表
void Print(SeqQueue *Q);
void Choose(int choice,SeqQueue *Q); void InitQueue(SeqQueue *Q); int EnterQueue(SeqQueue *Q,int x); int DeleteQueue(SeqQueue *Q,int *x); void PrintQueue(SeqQueue *Q); int QueueEmpty(SeqQueue *Q); int QueueFront(SeqQueue *Q); int QueueFull(SeqQueue *Q);
//主函数
int main()
{
SeqQueue Q;
InitQueue(&Q);
Print(&Q);
while(true)
{
printf("Press enter to continue.........");
getchar();
getchar();
system("cls");
Print(&Q);
}
return 0;
}
//重复刷新 并 打印功能选项列表 来模拟面向对象编程的等待命令操作
void Print(SeqQueue *Q)
{
int choice;
printf("---------------------\n");
printf("1.入队.\n");
printf("2.出队.\n");
printf("3.打印输出当前队列.\n");
printf("4.打印输出当前队列头元素.\n");
printf("5.按其它任意键退出.\n");
printf("---------------------\n");
printf("请选择你要的操作:");
scanf("%d",&choice);
Choose(choice,Q);
}
//选择功能函数
void Choose(int choice,SeqQueue *Q) {
int i;
int n;
int a;
int x=0;
switch(choice)
{
case 1:
printf("请输入要入队的元素个数:");
scanf("%d",&n);
printf("请依次输入要入队的%d个元素:\n",n);
for(i=1;i<=n;i++)
{
scanf("%d",&x);
EnterQueue(Q,x);
}
printf("入队成功~\n");
break;
case 2:
printf("请输入要出队的元素个数:");
scanf("%d",&n);
printf("出队的%d个元素依次为:\n",n);
while(n--)
{
DeleteQueue(Q,&x);
printf("%d ",x);
}
printf("\n");
printf("出队成功~\n");
break;
case 3:
PrintQueue(Q);
break;
case 4:
a=QueueFront(Q);
printf("%d\n\n",a);
break;
default:
exit(0);
}
}
//初始化队列函数
void InitQueue(SeqQueue *Q) {
//将*Q初始化为一个空的循环队列
Q->front=Q->rear=0;
}
//入队函数
int EnterQueue(SeqQueue *Q,int x) {
//将元素x入队
if((Q->rear+1)%Size==Q->front)//队列已经满了
{
return false;
}
Q->element[Q->rear]=x;
Q->rear=(Q->rear+1)%Size;//重置尾指针
return true;
}
//出队函数
int DeleteQueue(SeqQueue *Q,int *x) {
//删除队列的队头元素,用x返回其值
if(Q->front==Q->rear)//队列为空
return false;
*x=Q->element[Q->front];
Q->front=(Q->front+1)%Size;//重新设置队头指针
return true;
}
//打印输出队列
void PrintQueue(SeqQueue *Q) {
int i;
for(i=Q->front;irear;i++)
{
printf("%d ",Q->element[i]);
}
printf("\n");
}
//判断空队列
int QueueEmpty(SeqQueue *Q) {
return Q->count==0; //队列无元素为空 }
//判断满队列
int QueueFull(SeqQueue *Q) {
return Q->count==Size; //队中元素个数等于Size时队满
}
//取队头元素
int QueueFront(SeqQueue *Q) {
if(QueueEmpty(Q))
printf("Queue if empty.");
return Q->element[Q->front];
}