数据结构实验报告3-基于循环队列的排队买票模拟程序

实验内容及要求:

编程建立循环队列存储结构,对排队买票过程进行模拟。要求程序在控制台屏幕上显示字符菜单:

1. 排队——输入新到达的买票人姓名,加入买票队列中;

2. 售票——排队队列中最前面的人购票成功,显示信息并将其从队列中删除;

3. 查看队列——从队首到队尾依次列出所有正在排队买票人的姓名;

4. 结束——退出系统。

“排队”时,若队满,应提示等待(排队不成功);

“售票”时,若队空,应提示无人排队(售票失败)。

实验目的:掌握循环队列的基本操作。

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
#define MAX_SIZE 20
using namespace std;
typedef struct Queue {
	int MaxSize;
	string name[MAX_SIZE];
	int front;
	int rear;

}SqQueue;
//初始化队列
void Init(SqQueue  &   q) {
	q.front = -1;
	q.rear = -1;
	q.MaxSize = MAX_SIZE;
	
}
//判断队列是否为空
bool Empty(SqQueue& q) {
	if (q.rear  == q.front)return true;
	else return false;
}
//判断队列是否已满
bool Full(SqQueue& q) {
	if ((q.rear + 1) % MAX_SIZE == (q.front + MAX_SIZE) % MAX_SIZE)
		return true;
	else return false;
}
//入队
bool EnQueue(SqQueue&q,string e ) {
	//判断是否队满
	if (Full(q))
		return false;
	//尾指针移动入队
	q.rear = (q.rear + 1) % q.MaxSize;
	//赋值
	q.name[q.rear] = e;
	
	return true;

}
//出队
bool Pop(SqQueue&q,string & e) {
	//判断该队列是否为空
	if (Empty(q))
		return false;
	//头指针移动
	q.front = (q.front + 1) % q.MaxSize;
	//赋值
	e = q.name[q.front];
	
	return true;
}
//排队
void Line(SqQueue&q) {
	string name;
	cout << "请输入新到达的买票人姓名:" << endl;
	cin >> name;
	if (EnQueue(q, name))
		cout << "排队成功!!!" << endl;
	else cout << "排队不成功!!!" << endl;
}
//售票
void Sale(SqQueue&q) {
	string name ;
	if (Pop(q, name))
		cout <<name<< "购票成功!!!" << endl;
	else cout << "购票失败!!!" << endl;
}
//查看队列
void LookSq(SqQueue&q) {
	//判断队列是否为空
	if (Empty(q))
		cout << "无人排队!!!" << endl;
	else {
		cout << "正在排队的人:" << endl;
		for (int i = q.front+1 ; i <= q.rear; i++) {
			cout << q.name[i]<<endl;
		}
	}
}


int Menu(SqQueue& q)
{
	cout << "***********************" << endl;
	cout << "主菜单" << endl;
	cout << "1.排队" << endl;
	cout << "2.售票" << endl;
	cout << "3.查看队列" << endl;
	cout << "4.结束" << endl;
	cout << "5.清除界面" << endl;
	cout << "***********************" << endl;
	int choice;
	while (cin >> choice)
	{
		switch (choice)
		{
		case 1:
			Line(q); 
			break;
		case 2:
			Sale(q);
			break;
		case 3:
			LookSq(q);
			break;
		case 4:
			return 0;
		case 5:
		{system("cls");
		Menu(q);
		break; 
		}
		default:  
			return -1;
		}
	}
	system("pause");
}

void main() {
	SqQueue q;
	Init(q);
	Menu(q);
	
}

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值