实验2:栈和队列的基本操作实现及其应用
一、实验目的
1、 熟练掌栈和队列的结构特点,掌握栈和队列的顺序存储和链式存储结构和实现。
2、 学会使用栈和队列解决实际问题。
二、实验内容
1、自己确定结点的具体数据类型和问题规模:
分别建立一个顺序栈和链栈,实现栈的压栈和出栈操作。
分别建立一个顺序队列和链队列,实现队列的入队和出队操作。
2、设计算法并写出代码,实现将一个十进制数转换成二进制数。
3、选做题(*)
设计一个模拟饭堂排队打饭管理软件,实现“先来先打饭”的排号叫号管理。
三、实验步骤
1、依据实验内容分别说明实验程序中用到的数据类型的定义;
2、相关操作的算法表达;
3、完整程序;
4、总结、运行结果和分析。
5、总体收获和不足,疑问等。
1.1分别建立一个顺序栈和链栈,实现栈的压栈和出栈操作。
#ifndef SeqStack_H
#define SeqStack_H
const int StackSize=10;
template<class DataType>
class SeqStack
{
public:
SeqStack();//构造函数
~SeqStack(){}//析构函数
voidPush(DataType x);//入栈
DataTypePop();//将栈顶元素弹出
DataTypeGetTop();//取栈顶元素(并不取出)
intEmpty();//判空
private:
DataTypedata[StackSize];//存放栈元素的数组
int top;
};
#endif
#include"SeqStack.h"
template<class DataType>
SeqStack<DataType>::SeqStack()
{
top=-1;
}
template<class DataType>
voidSeqStack<DataType>::Push(DataType x)
{
if(top==StackSize-1)throw"上溢";
top++;
data[top]=x;
}
template<class DataType>
DataType SeqStack<DataType>::Pop()
{
DataTypex;
if(top==-1)throw"下溢";
x=data[top--];
returnx;
}
template<class DataType>
DataType SeqStack<DataType>::GetTop()
{
if(top!=-1)
returndata[top];
}
template<class DataType>
int SeqStack<DataType>::Empty()
{
if(top==-1)
return1;
else
return0;
}
#include<iostream>
using namespace std;
#include"SeqStack.cpp"
void main()
{
SeqStack<int>S;
if(S.Empty())
cout<<"栈为空"<<endl;
else
cout<<"栈非空"<<endl;
cout<<"对7和27执行入栈操作"<<endl;
S.Push(7);
S.Push(27);
cout<<"栈顶元素为:"<<endl;
cout<<S.GetTop()<<endl;
cout<<"执行一次出栈操作"<<endl;
S.Pop();
cout<<"栈顶元素为:"<<endl;
cout<<S.GetTop()<<endl;
}

1.2分别建立一个顺序队列和链队列,实现队列的入队和出队操作。
#ifndef LinkQueue_H
#define LinkQueue_H
template<class DataType>//定义链队列的节点
struct Node
{
DataTypedata;
Node<DataType>*next;
};
template<class DataType>//链队列类的声明
class LinkQueue
{
public:
LinkQueue();
~LinkQueue();
voidEnQueue(DataType x);//将元素入队
DataTypeDeQueue();//将队头元素出队
DataTypeGetQueue();//取链队列的队头元素
intEmpty();//判空
private:
Node<DataType>*front,*rear;//队头和队尾指针
};
#endif;
#include"LinkQueue.h"
template<class DataType>
LinkQueue<DataType>::LinkQueue()
{
Node<DataType>*s=NULL;
s=newNode<DataType>;
s->next=NULL;
front=rear=s;
}
template<class DataType>
LinkQueue<DataType>::~LinkQueue()
{
Node<DataType>*p=NULL;
while(front!=NULL)
{
p=front->next;
deletefront;
front=p;
}
}
template<class DataType>
voidLinkQueue<DataType>::EnQueue(DataType x)
{
Node<DataType>*s=NULL;
s=newNode<DataType>;
s->data=x;
s->next=NULL;
rear->next=s;rear=s;
}
template<class DataType>
DataTypeLinkQueue<DataType>::DeQueue()
{
Node<DataType>*p=NULL;
intx;
if(rear==front)throw"";
p=front->next;
x=p->data;
front->next=p->next;
if(p->next==NULL)rear=front;
deletep;
returnx;
}
template<class DataType>
DataTypeLinkQueue<DataType>::GetQueue()
{
if(front!=rear)
returnfront->next->data;
}
template<class DataType>
int LinkQueue<DataType>::Empty()
{
if(front==rear)
return1;
else
return0;
}
#include<iostream>
using namespace std;
#include"LinkQueue.cpp"
void main()
{
LinkQueue<int>Q;
if(Q.Empty())
cout<<"队列为空"<<endl;
else
cout<<"队列非空"<<endl;
cout<<"元素7和17执行入队操作:"<<endl;
try
{
Q.EnQueue(7);
Q.EnQueue(17);
}
catch(char*wrong)
{
cout<<wrong<<endl;
}
cout<<"查看队头元素:"<<endl;
cout<<Q.GetQueue()<<endl;
cout<<"执行出队操作:"<<endl;
try
{
Q.DeQueue();
}
catch(char*wrong)
{
cout<<wrong<<endl;
}
cout<<"查看队头元素:"<<endl;
cout<<Q.GetQueue()<<endl;
}

2.设计算法并写出代码,实现将一个十进制数转换成二进制数。
#include <iostream>
using namespace std;
const int StackSize=10;
template<class DataType>
class SeqStack
{
public:
SeqStack();
~SeqStack(){};
void Push(DataType x);
DataType Pop();
void Binary(int num);
private:
DataType data[StackSize];
int top;
};
template<class DataType>
SeqStack<DataType>::SeqStack()
{
top=-1;
}
template<class DataType>
voidSeqStack<DataType>::Push(DataType x)
{
if(top==StackSize-1)throw"上溢";
top++;
data[top]=x;
}
template<class DataType>
DataTypeSeqStack<DataType>::Pop()
{
DataType x;
if(top==-1)throw"下溢";
x=data[top--];
return x;
}
template<class DataType>
void SeqStack<DataType>::Binary(intnum)
{
int k;
top=-1;
while(num!=0)
{
k=num%2;//得到余数
Push(k);
num=num/2;
}
while(top!=-1){
cout<<Pop();
}
}
int main()
{
int num;
SeqStack<int>S;
cout<<"请输入一个十进制的数字:";
cin>>num;
cout<<"转化为二进制后的数字为:";
S.Binary(num);
cout<<endl;
return 0;
}


被折叠的 条评论
为什么被折叠?



