一、实验目的
1、 熟练掌栈和队列的结构特点,掌握栈和队列的顺序存储和链式存储结构和实现。
2、 学会使用栈和队列解决实际问题。
1、自己确定结点的具体数据类型和问题规模:
分别建立一个顺序栈和链栈,实现栈的压栈(插入元素)和出栈(删除元素)操作。
分别建立一个顺序队列和链队列,实现队列的入队和出队操作。
2、设计算法并写出代码,实现一个十进制数转换成2进制数。
3、选做题(*)
设计一个模拟饭堂排队打饭管理软件,实现“先来先打饭”的排号叫号管理。
扫描二维码关注公众号,回复:
561195 查看本文章
1、依据实验内容分别说明实验程序中用到的数据类型的定义;
2、相关操作的算法表达;
3、完整程序;
4、总结、运行结果和分析。
5、总体收获和不足,疑问等。
1、 按照数据结构实验任务书,提前做好实验预习与准备工作。
2、 加“*”为选做题。做好可加分。
3、 严格按照数据结构实验报告模板和规范,及时完成实验报告。
4、 在个人主页上发文章提交作业。
5、 实验课会抽查3-5人,希望你可以被查到!
1、自己确定结点的具体数据类型和问题规模:
分别建立一个顺序栈和链栈,实现栈的压栈(插入元素)和出栈(删除元素)操作。
答:
完整代码:
#ifndefSeqStack_H //避免重复包含头文件 # defineSeqStack_H const intStackSize=10; //栈最多有10个元素 template<class DataType> class SeqStack { private: DataType data[StackSize]; //存放栈元素的数组 int top; //栈顶指针 public: SeqStack(); ~SeqStack(){} void Push(DataType x); //入栈操作,将元素X入栈 DataType Pop(); //出栈操作,将栈顶元素弹出 DataType GetTop() //取出栈顶元素(并不删除) int Empty() //判断栈是否为空 }; #endif #include"SeqStack.h" //引入类的声明 以下是类的成员函数定义 template<class DataType> SeqStack<DataType>::SeqStack() { top=-1; } template<class DataType> SeqStack<DataType>::Push(DataTypex) { if(top==StackSize-1) throw"上溢"; top++; data[top]=x; } template<class DataType> SeqStack<DataType>::Pop() { DataType x; if(top==-1) throw"下溢"; x=data[top--]; return x; } template<class DataType> SeqStack<DataType>::GetTop() { if(top!=-1) return data[top]; } template<class DataType> SeqStack<DataType>::Empty() { if(top==-1) return 1; else return 0; } #include<iostream.h> #include"SeqStack.cpp" void main() { SeqStack<int> S; //创建模板类的实例 if(S.Empty()) cout<<"栈为空"<<endl; else cout<<"栈非空"<<endl; cout<<"对15和10执行入栈操作"<<endl; S.Push(15); S.Push(10); cout<<"栈顶元素为:"<<endl; cout<<"S.GetTop()"<<endl; cout<<"执行一次出栈操作"<<endl; S.Pop(); cout<<"栈顶元素为:"<<endl; cout<<S.GetTop()<<endl; }
答:
完整代码:
#ifndefLinkQueue_H #defineLinkQueue_H template<class DataType> //定义链队列的结点 structNode { DataType data; Node<DataType> *next; }; template<class DataType> classLinkQueue { public: LinkQueue(); ~LinkQueue(); void EnQueue(DataType x); //将元素X入队 DataType DeQueue(); //将队头元素出队 DataType GetQueue(); //取链队列的队头元素 int Empty(); //判断链队列是否为空 private: Node<DataType> *front,*rear; //队头和队尾指针 }; #endif; #include"LinkQueue.h" template<class DataType> LinkQueue<DataType>::LinkQueue() { Node<DataType> *s=NULL; s=new Node<DataType>; s->next=s; front=rear=s; } template<class DataType> LinkQueue<DataType>::~LinkQueue() { Node<DataType> *p=NULL; while(front!=NULL) { p=front->next; delete front; front=p; } } template<class DataType> voidLinkQueue<DataType>::EnQueue(DataType x) { Node<DataType> *s=NULL; s=new Node<DataType>; s->data=x; s->next=NULL; //申请一个数据域为x的结点s s->next=NULL; rear->next=s;rear=s; //将结点插入到队尾 } template<class DataType> DataTypeLinkQueue<DataType>::DeQueue() { Node<DataType> *p=NULL; int x; if(rear==front) throw"下溢"; p=front->next; x=p->data; //暂存队头元素 front->next=p->next; //将队头元素所在结点摘链 if(p->next==NULL) rear=front; //判断出队前队列长度是否为1 delete p; return x; } template<class DataType> DataTypeLinkQueue<DataType>::GetQueue() { if(front!=rear) return front->next->data; } template<class DataType> intLinkQueue<DataType>::Empty() { if(front==rear) return 1; else return 0; } #include<iostream> usingnamespace std; #include"LinkQueue.cpp" voidmain() { LinkQueue<int> Q; if(Q.Empty()) cout<<"队列为空"<<endl; else cout<<"队列非空"<<endl; cout<<"元素10和15执行入队操作:"<<endl; try { Q.EnQueue(10); Q.EnQueue(15); } 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、设计算法并写出代码,实现一个十进制数转换成2进制数。
<1>依据实验内容分别说明实验程序中用到的数据类型的定义;
答: void Push(DataType x); 空类型
void Decimaltor(int num); 空类型
int top; 整型
const int StackSize=10; 整型
<2>相关操作的算法表达;
答:(1)将十进制数转换为二进制数
v oidSeqStack<DataType>::Decimaltor(int num)
{
int k;
top=-1;
while(num!=0)
{
k=num%2; //得到余数
Push(k);
num=num/2;
}
while(top!=-1)
{
cout<<Pop();
}
}
<3>完整代码:
答:
#include<iostream> usingnamespace std; constint StackSize=10; template<classDataType> classSeqStack { public: SeqStack(); //构造函数,栈的初始化 ~SeqStack(){}; //析构函数 void Push(DataType x); //将x入栈 DataType Pop(); //将栈顶元素弹出 void Decimaltor(int num); //将十进制数转换为二进制数 private: DataType data[StackSize]; //存放栈元素的数组 int top; //栈顶指针,指示栈顶元素在数组中的下标 }; template<classDataType> SeqStack<DataType>::SeqStack() { top=-1; } template<classDataType> voidSeqStack<DataType>::Push(DataType x) { if(top==StackSize-1)throw"上溢"; top++; data[top]=x; } template<classDataType> DataTypeSeqStack<DataType>::Pop() { DataType x; if(top==-1)throw"下溢"; x=data[top--]; return x; } template<classDataType> voidSeqStack<DataType>::Decimaltor(int num) { 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<<"请输入一个十进制的数字:"<<endl; cin>>num; S.Decimaltor(num); return 0; }
2、设计算法并写出代码,实现一个十进制数转换成2进制数。 <1>依据实验内容分别说明实验程序中用到的数据类型的定义; 答: void Push(DataType x); 空类型 void Decimaltor(int num); 空类型 int top; 整型 const int StackSize=10; 整型 <2>相关操作的算法表达; 答:(1)将十进制数转换为二进制数 voidSeqStack<DataType>::Decimaltor(int num) { int k; top=-1; while(num!=0) { k=num%2; //得到余数 Push(k); num=num/2; } while(top!=-1) { cout<<Pop(); } }
4.运行结果