1.采用链式存储实现队列的初始化、队列空、入队、出队、遍历等操作。
2.设计一个模拟食堂排队打饭管理软件,实现“先来先打饭”的排号叫号管理。(能实现入队显示排队编号、能显示排队总人数、叫号等功能,可调用已写好的队列基本操作)。
#include<iostream>
using namespace std;
class Node {
public:
int data;
Node* next;
};
class Queue
{
public:
bool Init_Queue();
bool Destory_Queue();
bool Clear_Queue();
bool Empty_Quene();
int Length_Queue();
bool GetHead_Queue(int& e);
bool EnQueue(int e);
bool DeQueue(int& e);
void QueueTraverse();
private:
Node* front;
Node* rear;
};
bool Queue::Init_Queue() {
front = rear = new Node;
if (!front)
exit(-1);
front->next = NULL;
return 1;
}
bool Queue::Destory_Queue() {
while (front) {
rear = front->next;
delete front;
front = rear;
}
return 1;
}
bool Queue::Clear_Queue() {
rear = front;
if (rear == front)
return 1;
else
return 0;
}
bool Queue::Empty_Quene() {
if (front == rear)
return 1;
else
return 0;
}
int Queue::Length_Queue() {
int count = 0;
Node* p = front->next;
while (p != rear->next)
{
count++;
p = p->next;
}
return count;
}
bool Queue::GetHead_Queue(int& e) {
if (front == rear)
return 0;
else
e = front->next->data;
return 1;
}
bool Queue::EnQueue(int e) {
Node* p = new Node;
if (!p)
exit(-1);
p->data = e;
p->next = NULL;
rear->next = p;
rear = p;
return 1;
}
bool Queue::DeQueue(int& e) {
if (front == rear)
return 0;
Node* p;
p = front->next;
e = p->data;
front->next = p->next;
if (rear == p)
rear = front;
delete p;
return 1;
}
void Queue::QueueTraverse() {
Node* p = front->next;
while (p != rear->next) {
cout << p->data<<" ";
p = p->next;
}
cout << endl;
}
int main()
{
Queue Q;
int i;
int e, e0, e1, e3,e4;
cout << "1.构造一个空队列 2.销毁队列Q 3.将Q清为空队列 4.判断Q是否为空队列 5.返回Q中数据元素个数\n";
cout << "6.返回Q的队头元素 7.插入队尾元素 8.删除队头元素 9.队列的遍历 0.退出\n";
cout << "10.**********************打饭请排队************************" << endl;
cout << endl;
do
{
cout << "请输入要执行的操作: ";
cin >> i;
switch (i)
{
case 1:
if (Q.Init_Queue() == 1)
cout << "初始化成功 "<<endl;
else
cout << "初始化失败 "<<endl;
break;
case 2:
Q.Destory_Queue();
case 3:
if (Q.Clear_Queue() == 1)
{
cout << "清空成功 清空后的链表为:" << endl;
Q.QueueTraverse();
cout << endl;
}
else {
cout << "清空失败 " << endl;
}
case 4:
cout << "队列是否为空:";
if (Q.Empty_Quene() == 1)
{
cout << "TRUE" << endl;
}
else
{
cout << "FALSE" << endl;
}
break;
case 5:
cout << "队列的元素个数为:" << Q.Length_Queue() << endl;
break;
case 6:
if (Q.GetHead_Queue(e) == 0)
{
cout << "该队列为空队列 " << endl;
}
else
{
if (Q.GetHead_Queue(e) == 1)
cout << "该队列的队头元素为:" <<e<< endl;
}
break;
case 7:
int e0;
cout << "输入需要插入的队尾元素:";
cin >> e0;
if ( Q.EnQueue(e0)== 1)
{
cout << "插入成功 插入后的队列为:";
Q.QueueTraverse();
}
else
{
cout << "插入失败 ";
}
break;
case 8:
if (Q.DeQueue(e1) == 0)
{
cout << "该队列不存在队头元素"<<endl;
}
else
{
cout << "删除的队头元素为:" << e1<<endl;
cout << "删除队头后的队列为:";
if (Q.Empty_Quene() == 1)
cout << "该队列为空队列" << endl;
else
{
Q.QueueTraverse();
}
cout << endl;
}
break;
case 9:
if (Q.Empty_Quene() == 1)
{
cout << "该队列为空队列" << endl;
}
else
{
cout << "当前队列的元素为:";
Q.QueueTraverse();
cout << endl;
}
break;
case 10:
Q.Init_Queue();
cout << "请输入需要打饭的学生数量:" << endl;
int n;
cin >> n;
cout << "请输入学生的编号:";
for (int j = 0; j < n; j++)
{
cin >> e3;
Q.EnQueue(e3);
}
for (int k = 0; k < n; k++)
{
cout << "需要打饭的人数为:"<<Q.Length_Queue()<<" ";
cout << "需要打饭的学生顺序为:" << endl;
Q.QueueTraverse();
Q.DeQueue(e4);
cout << "为"<<e4<<"号学生打饭" << endl;
}
default:
break;
}
} while(i!=0);
return 0;
}