《数据结构》实验三:栈和队列实验
一..实验目的
巩固栈和队列数据结构,学会运用栈和队列。
1.回顾栈和队列的逻辑结构和受限操作特点,栈和队列的物理存储结构和常见操作。
2.学习运用栈和队列的知识来解决实际问题。
3.进一步巩固程序调试方法。
4.进一步巩固模板程序设计。
二.实验时间
准备时间为第5周到第6周,具体集中实验时间为6周第2次课。2个学时。
三..实验内容
1.自己选择顺序或链式存储结构,定义一个空栈类,并定义入栈、出栈、取栈元素基本操作。然后在主程序中对给定的N个数据进行验证,输出各个操作结果。
2.自己选择顺序或链式存储结构,定义一个空栈队列,并定义入栈、出栈、取栈元素基本操作。然后在主程序中对给定的N个数据进行验证,输出各个操作结果。3.编程实现一个十进制数转换成二进制数。要求,要主程序中输出一个10进度数,输出其对应的2进制数序列。
前两题是必做题,第3题是选做题。
顺序栈和链栈的验证都在一个程序中实现!
代码如下:
/**********头文件*********/ /*********************顺序栈定义*********************/ const int Maxsize=10; template<class T1> class SZhan { public : SZhan(); ~SZhan(){} void push1(T1 x1); T1 Pop1(); T1 GetTop1(); int Empty1(); private: T1 data1[Maxsize]; int top1; }; /*********************链栈定义*********************/ template<class T2> struct Node { T2 data2; Node<T2>*next; }; template<class T2> class LZhan { public: LZhan(); ~LZhan(); void push2(T2 x2); T2 Pop2(); T2 GetPop2(); int Empty2(); private: Node<T2>* top2; }; #include<iostream> using namespace std; #include"slzhan.h" /*****************顺序栈初始化******************/ template<class T1> SZhan<T1>::SZhan() { top1=-1; } template<class T1> void SZhan<T1>::push1(T1 x1) { if(top1==Maxsize-1)throw"上溢"; top1++; data1[top1]=x1; } template<class T1> T1 SZhan<T1>::Pop1() { T1 x1; if(top1==-1)throw"下溢"; x1=data1[top1--]; return x1; } template<class T1> T1 SZhan<T1>::GetTop1() { if(top1!=-1) return data1[top1]; } template<class T1> int SZhan<T1>::Empty1() { if(top1==-1) return 1; else return 0; } /**************链栈初始化***************/ template<class T2> LZhan<T2>::LZhan() { top2=NULL; } template<class T2> LZhan<T2>::~LZhan() { Node<T2>*q=new Node<T2>; while(top2!=NULL) { q=top2; top2=top2->next; delete q; } } template<class T2> void LZhan<T2>::push2(T2 x2) { Node<T2>*s=new Node<T2>; s->data2=x2; s->next=top2; top2=s; } template<class T2> T2 LZhan<T2>::Pop2() { int x3; Node<T2>*p=new Node<T2>; ; if(top2==NULL)throw"下溢"; x3=top2->data2; p=top2; top2=top2->next; delete p; return x3; } template<class T2> T2 LZhan<T2>::GetPop2() { if(top2!=NULL) return top2->data2; } template<class T2> int LZhan<T2>::Empty2() { if(top2==NULL) <span style="white-space:pre"> </span>return 1; <span style="white-space:pre"> </span>else <span style="white-space:pre"> </span>return 0; } /***********主函数源文件************/ #include<iostream> using namespace std; #include"slzhan.cpp" void shun() { SZhan<int> S; cout<<"判断栈是否为空:"; if(S.Empty1()) cout<<"空"<<endl; else cout<<"非空"<<endl; cout<<"插入9和21两个数值"<<endl; S.push1(9); S.push1(21); cout<<"栈顶元素为:"; cout<<S.GetTop1()<<endl; cout<<"执行一次出栈操作,出栈的元素为:"; cout<<S.Pop1()<<endl; cout<<"执行出栈操作后栈顶元素为:"<<S.GetTop1()<<endl; } void lian() { LZhan<int> L; if(L.Empty2()) cout<<"链栈为空"<<endl; else cout<<"链栈非空"<<endl; cout<<"分别往链栈里插入12和18!"<<endl; L.push2(12); L.push2(18); cout<<"栈顶元素为:"<<L.GetPop2()<<endl; cout<<"执行第一次弹栈操作,弹栈元素为:"; cout<<L.Pop2()<<endl; cout<<"弹栈后的栈顶元素为:"<<L.GetPop2()<<endl; } void main() { int m; char z='y'; cout<<"\t1.验证顺序栈"<<endl; cout<<"\t2.验证链栈 "<<endl; while(z=='y'||z=='Y') { cout<<"请输入:"; cin>>m; cout<<endl; switch(m) { case 1:shun();break; case 2:lian();break; default:cout<<"error"<<endl; } cout<<"是否继续:"; cin>>z; cout<<"-------------------------------------"<<endl; } }
算法流程图:
程序运行结果:
总结:
链栈没有浪费空间的问题,而顺序栈在初始化时需要一定的固定长度的存储空间,在元素个数比较小的时候适合用顺序栈,元素个数变化大的时候适合用链栈,但使用链栈的时候,栈中每个元素都是需要一个指针域。会产生结构性开销,个人觉得编写顺序栈比较容易,因为C++指针一直是我个人觉得比较难和比较复杂的内容,所以无论是在链栈还是链表的编写上,一定要对C++指针内容要很熟悉才能够熟练的掌握!
原文链接:https://www.f2er.com/datastructure/382895.html