数据结构-队列

实验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;
}

结果:
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

特辣番茄炒鸡蛋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值