编程建立循环队列存储结构,对排队买票过程进行模拟。要求程序在控制台屏幕上显示字符菜单:
- 排队——输入新到达的买票人姓名,加入买票队列中;
- 售票——排队队列中最前面的人购票成功,显示信息并将其从队列中删除;
- 查看队列——从队首到队尾依次列出所有正在排队买票人的姓名;
- 结束——退出系统。
“排队”时,若队满,应提示等待(排队不成功);
“售票”时,若队空,应提示无人排队(售票失败)。
实现代码:
#include <iostream>
#include <cstring>
using namespace std;
#define MAX_SIZE 15
typedef struct
{
char** data;
int length; //队列最大长度
int f; //队头指针
int r; //队尾指针
}SqQueue;
//初始化队列
void init(SqQueue &q)
{
q.f = q.r = -1;
q.length = MAX_SIZE;
q.data = new char* [q.length];
for (int i = 0; i < q.length; i++)
q.data[i] = new char[9];
}
//判断队列是否为空
int empty(SqQueue &q)
{
return q.f == q.r;
}
//判断队列是否已满
int full(SqQueue &q)
{
return (q.r + 1) % q.length == (q.f + q.length) % q.length;
}
//入队
int enQueue(SqQueue &q, char *e)
{
if (full(q)) return 0;
q.r = (q.r + 1) % q.length;
strcpy_s(q.data[q.r], sizeof(e), e);
return 1;
}
//出队
int dlQueue(SqQueue &q, char *e)
{
if (empty(q)) return 0;
q.f = (q.f + 1) % q.length;
strcpy_s(e, sizeof(q.data[q.f]), q.data[q.f]);
return 1;
}
//遍历队列
void traverse(SqQueue &q)
{
if (empty(q)) cout << "队列为空!" << endl;
else{
cout << "正在排队的人:";
for (int i = q.f + 1; i <= q.r; i++)
cout << q.data[i] << " ";
}
}
//排队操作
void lineup(SqQueue &q)
{
char name[9];
cout << "请输入新到达的买票人姓名:";
cin >> name;
if (enQueue(q, name)) cout << "排队成功!" << endl;
else cout << "排队失败" << endl;
}
//售票操作
void sale(SqQueue &q)
{
char name[9];
if(dlQueue(q, name)) cout << "恭喜" << name << "购票成功!" << endl;
else cout << "购票失败" << endl;
}
//主菜单
void menu(SqQueue &q)
{
cout << "-----------------------" << endl;
cout << "主菜单" << endl;
cout << "1.排队" << endl;
cout << "2.售票" << endl;
cout << "3.查看队列" << endl;
cout << "4.退出系统" << endl;
cout << "-----------------------" << endl;
char choice;
while(cin>>choice)
{
switch (choice)
{
case '1': lineup(q); break;
case '2': sale(q); break;
case '3': traverse(q); break;
case '4': return;
default: return ;
}
}
system("pause");
}
int main()
{
SqQueue q;
init(q);
menu(q);
}