实验4:栈和队列的基本操作实现及其应用之顺序队列
一、实验目的
1、 熟练掌栈和队列的结构特点,掌握栈和队列的顺序存储和链式存储结构和实现。
2、 学会使用栈和队列解决实际问题。
二、实验内容
1、自己确定结点的具体数据类型和问题规模:
分别建立一个顺序栈和链栈,实现栈的压栈和出栈操作。
分别建立一个顺序队列和链队列,实现队列的入队和出队操作。
2、设计算法并写出代码,实现一个十将二进制转换成2进制数。
3、选做题(*)
设计一个模拟饭堂排队打饭管理软件,实现“先来先打饭”的排号叫号管理。
三、实验步骤
1、依据实验内容分别说明实验程序中用到的数据类型的定义
实验中选用的是整型来进行栈的数据输入。
2、相关操作的算法表达;
入队列:只需将队尾指针rear在循环意义下加1,然后将待插元素x插入队尾位置。
出队列:只需将队头指针front在循环意义下加1,然后读取并返回队头元素。
3、完整程序;
#include<iostream>
using namespace std;
const int Q=100;
class CirQueue
{
public:
CirQueue(){front=rear=Q-1;}
~CirQueue(){}
void Push(int x);
int Pop();
int Gettop();
int Empty(){if(front==rear)return 1;else return 0;}
private:
int data[Q];
int front,rear;
};
void CirQueue::Push(int x)
{
if((rear+1)%Q==front) throw "上溢";
rear=(rear+1)%Q;
data[rear]=x;
}
int CirQueue::Pop()
{
if(rear==front) throw"下溢";
front=(front+1)%Q;
return data[front];
}
int CirQueue::Gettop()
{
int i;
if(rear==front) throw"下溢";
i=(front+1)%Q;
return data[i];
}
int main()
{
int i,s,x;
CirQueue Stact;
do
{
cout<<endl<<"\t\t\t 顺序队列"<<endl<<"\t\t\t输入进队列的数:";
cin>>i;
cout<<"\t\t\t是否继续输入?(1/0):";
cin>>s;
Stact.Push(i);
}
while(s);
while(1)
{
cout<<endl<<"\t\t\t 顺序队列";
cout<<endl<<"\t\t\t 1、入队列";
cout<<endl<<"\t\t\t 2、出队列";
cout<<endl<<"\t\t\t 3、队列顶数";
cout<<endl<<"\t\t\t 4、队列是否为空";
cout<<endl<<"\t\t\t请选择操作(0-4):";
cin>>x;
cout<<endl;
if(x==0)
break;
switch(x)
{
case 1:
{
do
{
cout<<endl<<"\t\t\t输入进栈的数:";
cin>>i;
cout<<"\t\t\t是否继续输入?(1/0):";
cin>>s;
Stact.Push(i);
}
while(s);
break;
}
case 2:
{
cout<<"\t\t\t出栈:"<<Stact.Pop()<<endl;
break;
}
case 3:
{
cout<<"\t\t\t栈顶数:"<<Stact.Gettop()<<endl;
break;
}
case 4:
{
cout<<"\t\t\t栈是否为空:"<<Stact.Empty();
break;
}
default:
{
cout<<"\t\t\t请输入数字(0-5)!"<<endl;
}
}
}
}
4、总结、运行结果和分析。
5、总体收获和不足,疑问等。