实验5 队列的应用
一、【实验目的】
1.掌握队列的顺序存储结构
2.掌握队列先进先出运算原则在解决实际问题中的应用
二、实验内容
1.仿照教材顺序循环队列的例子,设计一个只使用队头指针和计数器的顺序循环队列抽象数据类型。其中操作包括:初始化、入队列、出队列、判断队列是否非空。编写主函数,设计合适的测试用例,验证你的队列是个循环队列。
以下是队列操作函数的定义:
(1)QueueInitiate(Q) 初始化队列Q
(2)QueueNotEmpty(Q) 队列Q非空否
(3)QueueAppend(Q,x) 入队列,在队列Q的队尾插入数据元素x。
(4)QueueDelete(Q,d) 出队列,把队列Q的队头元素删除并由参数d带回。
提示:队尾的位置可由队头指针与计数器进行求解,请思考它们之间的关系,同时还要考虑如何实现循环队列(可借助求模运算)。
测试:设置队列最大容量为10,第一次入满队列,然后出队3个元素,入队2个元素,出队所有元素并输出,观察输出元素是否符合先进先出的规则。
2.利用以上队列结构,编写算法(用函数表示算法)计算杨辉三角,参考课件P68页算法,打印出相应的数值。输出结果供参考。
QueueH.h
#include <stdio.h>
typedef int ElemType ;
#define MaxQueueSize 10
typedef struct //队列的结构体
{
ElemType queue[MaxQueueSize];
int front;
int count; /*计数器*/
}SequenceQueue;
void QueueInit(SequenceQueue *Q) //初始化队列
{
Q->front = 0; //定义初始头指针为 0
Q->count = 0; //初始计数器为 0
}
int QueueNotEmpty(SequenceQueue Q) //判断队列是否为空
{
if(Q.count == 0)
{
return 0;
}
else
{
return 1;
}
}
int QueueAppend(SequenceQueue *Q,ElemType x) //入队
{
if(Q->count > 0 && Q->front == (Q->front + Q->count))
{
printf("队列已满,无法插入!\n");
return 0;
}
else
{
Q->queue[(Q->front + Q->count) % MaxQueueSize] = x; //把数据插入队列的队尾
Q->count++;
return 1;
}
}
int QueueDelete(SequenceQueue *Q,ElemType *d)
{
if(Q->count == 0)
{
printf("循环队列已空,无数据元素出列!\n");
return 0;
}
else
{
*d = Q->queue[Q->front]; //将队头元素并赋给d
Q->front = (Q->front + 1) % MaxQueueSize;
Q->count--;
return 1;
}
}
int QueueGet(SequenceQueue *Q,ElemType *d)
{
if(Q->count == 0)
{
printf("循环队列已空,无数据元素出列!\n");
return 0;
}
else
{
*d = Q->queue[Q->front]; //将当前对头元素并赋给d
return 1;
}
}
QueueM.c
#include <stdio.h>
#include "QueueH.h"
void ClcQueue(void)
{
int data[10]; //队列的十个元素空间
int i,j,k;
ElemType outData;
SequenceQueue QueueData;
QueueInit(&QueueData);
printf("输入的元素都是用空格隔开\n");
printf("请输入10个数据:\n");
for(i = 0;i < 10;i++)
{
scanf("%d",&*(data + i));
QueueAppend(&QueueData,*(data + i));
}
//出队三个元素
printf("出队3个元素:");
for(j = 0;j < 3;j++)
{
QueueDelete(&QueueData,&outData);
printf(" %d",outData);
}
printf("\n");
//入队两个元素
printf("入队两个元素:\n");
for(i = 0;i < 2;i++)
{
scanf("%d",&*(data + i));
QueueAppend(&QueueData,*(data + i));
}
//全部出队
printf("全部出队:\n");
for(i = 0;i < 9;i++)
{
QueueDelete(&QueueData,&outData);
printf(" %d",outData);
}
}
void PascalTriangle(void)
{
//n行杨辉三角,n需要输入
int N; //多少行
SequenceQueue QueueYan;
int i,j,k,temp,n;
printf("\n杨辉三角:\n");
printf("请输入你需要的行数:\n");
scanf("%d",&N);
QueueInit(&QueueYan);
QueueAppend(&QueueYan,1); //入队第一行
for(n = 1;n <= N;n++)
{
QueueAppend(&QueueYan,1);
for(i = N;i >= n;i--)
{
printf(" ");
}
for(i = 1;i <= n - 1;i++)
{
QueueDelete(&QueueYan,&temp);
printf("%6d",temp); //这个打印出来是个金字塔型
QueueGet(&QueueYan,&k);
temp = temp + k;
QueueAppend(&QueueYan,temp);
}
QueueDelete(&QueueYan,&k);
printf("%6d",k);
QueueAppend(&QueueYan,1);
printf("\n");
}
while(!QueueNotEmpty(QueueYan))
{
QueueDelete(&QueueYan,&k);
printf("%6d",k);
}
}
int main(void)
{
ClcQueue(); //出队入队
PascalTriangle(); //杨辉三角
return 0;
}
结果: