GDPU 数据结构 天码行空5 队列

一、实验目的

1.掌握队列的顺序存储结构
2.掌握队列先进先出运算原则在解决实际问题中的应用

二、实验内容

  1. 仿照教材顺序循环队列的例子,设计一个只使用队头指针和计数器的顺序循环队列抽象数据类型。其中操作包括:初始化、入队列、出队列、判断队列是否非空。编写主函数,验证所设计的顺序循环队列的正确性。

    以下是队列操作函数的定义:
    (1) QueueInitiate(Q) 初始化队列Q
    (2) QueueNotEmpty(Q) 队列Q非空否
    (3) QueueAppend(Q,x) 入队列,在队列Q的队尾插入数据元素x。
    (4) QueueDelete(Q,d) 出队列,把队列Q的队头元素删除并由参数d带回。

提示:队尾的位置可由队头指针与计数器进行求解,请思考它们之间的关系,同时还要考虑如何实现循环队列(可借助求模运算)。

  1. 利用以上队列函数,编写算法(用函数表示算法)计算杨辉三角,并打印对应的数值。

三、实验源代码

🧀 queue.h

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef struct queue
{
	int* s;
	int front;
	int cnt;
}Q;
int mx = 100;
void QueueInitiate(Q* q)
{
	q->s = (int*)calloc(0, sizeof(int)*mx);
	q->cnt = 0;
	q->front = 0;
}

int QueueNotEmpty(Q* q)
{
	return q->cnt;
}

void QueueAppend(Q* q,int c)
{
	int r = (q->front + q->cnt)%mx;//下标映射
	if (q->cnt==mx)
	{
		cout << "队列已满,请稍后重试!" << endl;
		return;
	}
	q->s[r] = c;
	q->cnt++;
}

void QueueDelete(Q* q,int* d)
{
	if(q->cnt <= 0)
	{
		cout<< "队列为空!删除失败!"<<endl;
		return;
	}	
	*d = q->s[q->front];
	q->front = (q->front+1)%mx;
	q->cnt--;
}

🧀queue.cpp

#include "queue.h"
//队列实现杨辉三角
void testYangHui()
{
	cout<<"请输入杨辉三角的层数:";
	int n;
	cin >> n;
	Q* q = new Q;
	mx = 1000;
	QueueInitiate(q);
//	初始化
	QueueAppend(q, 1);
	int x = 0;
	for(int i = 1; i <= n;i++)
	{
		int margin = 1;//表示两边的 1
		int cnt = i-1;//cnt表示当前行除最后一个元素外的元素个数
		QueueAppend(q,margin);//给下一行添加左边的1
		while(cnt--){			
			QueueDelete(q,&x);// x 表示当前队首元素
			cout << x << " ";
			QueueAppend(q,x+q->s[q->front]);
		}
//		处理最后一个元素(因为最后一个元素无后继元素和它相加构成下一行的元素)
		QueueDelete(q,&x);
		cout << x << " ";
		QueueAppend(q,margin);//给下一行添加右边的1
		cout << endl;
	}
}
void menu(){
	cout << "======= 选择你的操作 ========"<< endl;
	cout << "==== 1 x:入队一个元素x  ====" << endl;
	cout << "==== 2:出队队一个元素   ====" << endl;
	cout << "==== 3:输出队列所有元素 ====" << endl;
	cout << "==== 0:结束             ====" << endl;
	cout << "=============================" << endl;
	
}
void print(Q* q)
{
	int cnt = q->cnt;
	if(cnt==0)
	{
		cout << "队列为空" << endl;
		return;
	}	
	int front = q->front;
	while(cnt--){
		int x = q->s[front++];
		cout << x  << " ";
		front %= mx;
	}
	cout << endl;
}
//验证循环数组实现队列的正确性
void testTrue()
{
	int flag,x;
	Q* q = new Q;
	mx = 3;
	QueueInitiate(q);
	menu();
	while(true)
	{
		cin >> flag;
		switch (flag) {
		case 1:
			{	cin >> x;
			QueueAppend(q,x);
			break;}
		case 2:
			{
			int flag = QueueDelete(q,&x);
			if(flag)
				cout <<"元素 "<<  x << " 出队"<< endl;
			break;
			}
		case 3:
			{	
			print(q);
			break;
			}
		case 0:
			return;
		default:
			cout << "非法输入" <<endl;
		}
		
	}
}



int main(void)
{
	testTrue();
//	testYangHui();
	return 0;
}

四、实验结果(测试数据)

在这里插入图片描述

# 五、实验总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值