您的位置:首页 > 理论基础 > 数据结构算法

(实验三)《数据结构》第三章 顺序栈与链栈的验证

2014-10-21 18:20 288 查看
数据结构》实验三: 栈和队列实验

一..实验目的

巩固栈和队列数据结构,学会运用栈和队列。

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++指针内容要很熟悉才能够熟练的掌握!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: