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

前端之家收集整理的这篇文章主要介绍了(实验三)《数据结构》第三章 顺序栈与链栈的验证前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

数据结构》实验三:栈和队列实验

一..实验目的

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

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

猜你在找的数据结构相关文章