栈和队列实验


一..实验目的

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

1.回顾栈和队列的逻辑结构和受限操作特点,栈和队列的物理存储结构和常见操作。

2.学习运用栈和队列的知识来解决实际问题。

3.进一步巩固程序调试方法。

4.进一步巩固模板程序设计。

二.实验时间

   准备时间为第5周到第6周,具体集中实验时间为6周第2次课。2个学时。

三..实验内容

1.自己选择顺序或链式存储结构,定义一个空栈类,并定义入栈、出栈、取栈元素基本操作。然后在主程序中对给定的N个数据进行验证,输出各个操作结果。

  1. //头文件  
  2. #ifndef S_H  
  3. #define S_H  
  4. const int Ssize=10;  
  5. template<class datatype>  
  6. class S  
  7. {  
  8.     public:  
  9.         S();  
  10.         ~S(){}  
  11.         void push(datatype x);  
  12.         datatype pop();  
  13.         datatype gettop();  
  14.         int empty();  
  15.     private:  
  16.         datatype data[Ssize];  
  17.         int top;  
  18. };  
  19. #endif  
  20.   
  21.   
  22. //源文件  
  23. #include "zdl_header.h"  
  24. template<class datatype>  
  25. S<datatype>::S()  
  26. {  
  27.     top=-1;  
  28. }  
  29. template<class datatype>  
  30. void S<datatype>::push(datatype x)  
  31. {  
  32.     if(top==Ssize-1)throw "上溢";  
  33.     top++;  
  34.     data[top]=x;  
  35. }  
  36. template<class datatype>  
  37. datatype S<datatype>::pop()  
  38. {  
  39.     datatype x;  
  40.     if(top==-1)throw "下溢";  
  41.     x=data[top--];  
  42.     return x;  
  43. }  
  44. template<class datatype>  
  45. datatype S<datatype>::gettop()  
  46. {  
  47.     if(top!=-1)  
  48.         return data[top];  
  49. }  
  50. template <class datatype>  
  51. int S<datatype>::empty()  
  52. {  
  53.     if(top==-1)return 1;  
  54.     else return 0;  
  55. }  
  56.   
  57.   
  58.   
  59. //主函数  
  60. #include<iostream>  
  61. using namespace std;  
  62. #include "zdl_sf.cpp"  
  63.   
  64. void main()  
  65. {  
  66.     S<int>s;  
  67.     if(s.empty())  
  68.         cout<<"栈为空"<<endl;  
  69.     else   
  70.         cout<<"栈非空"<<endl;  
  71.     cout<<"对以下10个数执行入栈操作"<<endl;  
  72.     s.push(15);  
  73.     s.push(45);  
  74.     s.push(75);  
  75.     s.push(10);  
  76.     s.push(195);      
  77.     s.push(35);  
  78.     s.push(18);  
  79.     s.push(19);   
  80.     s.push(36);  
  81.     s.push(15);  
  82.     cout<<"栈顶元素为:"<<endl;  
  83.     cout<<s.gettop()<<endl;  
  84.     cout<<"执行一次出栈操作"<<endl;  
  85.     s.pop();  
  86.     cout<<"栈顶元素为:"<<endl;  
  87.         cout<<s.gettop()<<endl;  
  88.     cout<<"执行一次出栈操作"<<endl;  
  89.     s.pop();  
  90.     cout<<"栈顶元素为:"<<endl;  
  91.         cout<<s.gettop()<<endl;  
  92.     cout<<"执行一次出栈操作"<<endl;  
  93.     s.pop();  
  94.     cout<<"栈顶元素为:"<<endl;  
  95.     cout<<s.gettop()<<endl;  
  96. }  
//头文件
#ifndef S_H
#define S_H
const int Ssize=10;
template<class datatype>
class S
{
	public:
		S();
		~S(){}
		void push(datatype x);
		datatype pop();
		datatype gettop();
		int empty();
	private:
		datatype data[Ssize];
		int top;
};
#endif


//源文件
#include "zdl_header.h"
template<class datatype>
S<datatype>::S()
{
	top=-1;
}
template<class datatype>
void S<datatype>::push(datatype x)
{
	if(top==Ssize-1)throw "上溢";
	top++;
	data[top]=x;
}
template<class datatype>
datatype S<datatype>::pop()
{
	datatype x;
	if(top==-1)throw "下溢";
	x=data[top--];
	return x;
}
template<class datatype>
datatype S<datatype>::gettop()
{
	if(top!=-1)
		return data[top];
}
template <class datatype>
int S<datatype>::empty()
{
	if(top==-1)return 1;
	else return 0;
}



//主函数
#include<iostream>
using namespace std;
#include "zdl_sf.cpp"

void main()
{
	S<int>s;
	if(s.empty())
		cout<<"栈为空"<<endl;
	else 
		cout<<"栈非空"<<endl;
	cout<<"对以下10个数执行入栈操作"<<endl;
	s.push(15);
	s.push(45);
	s.push(75);
	s.push(10);
	s.push(195);	
	s.push(35);
	s.push(18);
	s.push(19);	
	s.push(36);
	s.push(15);
	cout<<"栈顶元素为:"<<endl;
	cout<<s.gettop()<<endl;
	cout<<"执行一次出栈操作"<<endl;
	s.pop();
	cout<<"栈顶元素为:"<<endl;
		cout<<s.gettop()<<endl;
	cout<<"执行一次出栈操作"<<endl;
	s.pop();
	cout<<"栈顶元素为:"<<endl;
		cout<<s.gettop()<<endl;
	cout<<"执行一次出栈操作"<<endl;
	s.pop();
	cout<<"栈顶元素为:"<<endl;
	cout<<s.gettop()<<endl;
}

运行结果:


2.自己选择顺序或链式存储结构,定义一个空栈队列,并定义入栈、出栈、取栈元素基本操作。然后在主程序中对给定的N个数据进行验证,输出各个操作结果。

  1. //头文件  
  2. #ifndef L_H  
  3. #define L_H  
  4. template <class datatype>  
  5. struct node   
  6. {  
  7.     datatype data;  
  8.     node<datatype> *next;  
  9. };  
  10. template<class datatype>  
  11. class L  
  12. {  
  13.     public:  
  14.         L();  
  15.         ~L();  
  16.         void EQ(datatype x);  
  17.         datatype DQ();  
  18.         datatype GQ();  
  19.         int empty();  
  20.     private:  
  21.         node<datatype> *front,*rear;  
  22. };  
  23. #endif;  
  24.   
  25. //源文件  
  26. #include "dl_H.h"  
  27. template<class datatype>  
  28. L<datatype>::L()  
  29. {  
  30.     node<datatype> *s=NULL;  
  31.     s=new node<datatype>;  
  32.     s->next=NULL;  
  33.     front=rear=s;  
  34. }  
  35. template <class datatype>  
  36. L<datatype>::~L()  
  37. {  
  38.     node<datatype> *p=NULL;  
  39.     while(front !=NULL)  
  40.     {  
  41.         p=front->next;  
  42.         delete front;  
  43.         front=p;  
  44.     }  
  45. }  
  46. template<class datatype>  
  47. void L<datatype>::EQ(datatype x)  
  48. {  
  49.     node<datatype> *s=NULL;  
  50.     s=new node<datatype>;  
  51.     s->data=x;  
  52.     s->next=NULL;  
  53.     rear->next=s;  
  54.     rear=s;  
  55. }  
  56. template <class datatype>  
  57. datatype L<datatype>::DQ()  
  58. {  
  59.     node<datatype> *p=NULL;  
  60.     int x;  
  61.     if(rear==front) throw "下溢";  
  62.     p=front->next;  
  63.     x=p->data;  
  64.     front->next=p->next;  
  65.     if(p->next==NULL) rear=front;  
  66.     delete p;  
  67.     return x;  
  68. }  
  69. template <class datatype>  
  70. datatype L<datatype>::GQ()  
  71. {  
  72.     if(front!=rear)  
  73.         return front->next->data;  
  74. }  
  75. template<class datatype>  
  76. int L<datatype>::empty()  
  77. {  
  78.     if(front==rear)  
  79.         return 1;  
  80.     else  
  81.         return 0;  
  82. }  
  83.   
  84.   
  85. //主函数  
  86. #include<iostream>  
  87. using namespace std;  
  88. #include"dl_sf.cpp"  
  89.   
  90. void main()  
  91. {  
  92.     L<int>Q;  
  93.     if(Q.empty())  
  94.         cout<<"队列为空"<<endl;  
  95.     else  
  96.         cout<<"队列非空"<<endl;  
  97.     cout<<"对以下10个元素执行入队操作:"<<endl;  
  98.     try  
  99.     {  
  100.         Q.EQ(10);  
  101.         Q.EQ(16);  
  102.         Q.EQ(19);  
  103.         Q.EQ(34);  
  104.         Q.EQ(56);  
  105.         Q.EQ(13);  
  106.         Q.EQ(45);  
  107.         Q.EQ(15);  
  108.         Q.EQ(24);  
  109.         Q.EQ(77);  
  110.     }  
  111.     catch(char * wrong)  
  112.     {  
  113.         cout<<wrong<<endl;  
  114.     }  
  115.     cout<<"查看队头元素:"<<endl;  
  116.     cout<<Q.GQ()<<endl;  
  117.     cout<<"执行出队操作:"<<endl;  
  118.     try  
  119.     {  
  120.         Q.DQ();  
  121.     }  
  122.     catch(char * wrong)  
  123.     {  
  124.         cout<<wrong<<endl;  
  125.     }  
  126.     cout<<"查看队头元素:"<<endl;  
  127.     cout<<Q.GQ()<<endl;  
  128.         cout<<"执行出队操作:"<<endl;  
  129.     try  
  130.     {  
  131.         Q.DQ();  
  132.     }  
  133.     catch(char * wrong)  
  134.     {  
  135.         cout<<wrong<<endl;  
  136.     }  
  137.     cout<<"查看队头元素:"<<endl;  
  138.     cout<<Q.GQ()<<endl;  
  139.         cout<<"执行出队操作:"<<endl;  
  140.     try  
  141.     {  
  142.         Q.DQ();  
  143.     }  
  144.     catch(char * wrong)  
  145.     {  
  146.         cout<<wrong<<endl;  
  147.     }  
  148.     cout<<"查看队头元素:"<<endl;  
  149.     cout<<Q.GQ()<<endl;  
  150.         cout<<"执行出队操作:"<<endl;  
  151.     try  
  152.     {  
  153.         Q.DQ();  
  154.     }  
  155.     catch(char * wrong)  
  156.     {  
  157.         cout<<wrong<<endl;  
  158.     }  
  159.     cout<<"查看队头元素:"<<endl;  
  160.     cout<<Q.GQ()<<endl;  
  161. }  
//头文件
#ifndef L_H
#define L_H
template <class datatype>
struct node 
{
	datatype data;
	node<datatype> *next;
};
template<class datatype>
class L
{
	public:
		L();
		~L();
		void EQ(datatype x);
		datatype DQ();
		datatype GQ();
		int empty();
	private:
		node<datatype> *front,*rear;
};
#endif;

//源文件
#include "dl_H.h"
template<class datatype>
L<datatype>::L()
{
	node<datatype> *s=NULL;
	s=new node<datatype>;
	s->next=NULL;
	front=rear=s;
}
template <class datatype>
L<datatype>::~L()
{
	node<datatype> *p=NULL;
	while(front !=NULL)
	{
		p=front->next;
		delete front;
		front=p;
	}
}
template<class datatype>
void L<datatype>::EQ(datatype x)
{
	node<datatype> *s=NULL;
	s=new node<datatype>;
	s->data=x;
	s->next=NULL;
	rear->next=s;
	rear=s;
}
template <class datatype>
datatype L<datatype>::DQ()
{
	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;
	delete p;
	return x;
}
template <class datatype>
datatype L<datatype>::GQ()
{
	if(front!=rear)
		return front->next->data;
}
template<class datatype>
int L<datatype>::empty()
{
	if(front==rear)
		return 1;
	else
		return 0;
}


//主函数
#include<iostream>
using namespace std;
#include"dl_sf.cpp"

void main()
{
	L<int>Q;
	if(Q.empty())
		cout<<"队列为空"<<endl;
	else
		cout<<"队列非空"<<endl;
	cout<<"对以下10个元素执行入队操作:"<<endl;
	try
	{
		Q.EQ(10);
		Q.EQ(16);
		Q.EQ(19);
		Q.EQ(34);
		Q.EQ(56);
		Q.EQ(13);
		Q.EQ(45);
		Q.EQ(15);
		Q.EQ(24);
		Q.EQ(77);
	}
	catch(char * wrong)
	{
		cout<<wrong<<endl;
	}
	cout<<"查看队头元素:"<<endl;
	cout<<Q.GQ()<<endl;
	cout<<"执行出队操作:"<<endl;
	try
	{
		Q.DQ();
	}
	catch(char * wrong)
	{
		cout<<wrong<<endl;
	}
	cout<<"查看队头元素:"<<endl;
	cout<<Q.GQ()<<endl;
		cout<<"执行出队操作:"<<endl;
	try
	{
		Q.DQ();
	}
	catch(char * wrong)
	{
		cout<<wrong<<endl;
	}
	cout<<"查看队头元素:"<<endl;
	cout<<Q.GQ()<<endl;
		cout<<"执行出队操作:"<<endl;
	try
	{
		Q.DQ();
	}
	catch(char * wrong)
	{
		cout<<wrong<<endl;
	}
	cout<<"查看队头元素:"<<endl;
	cout<<Q.GQ()<<endl;
		cout<<"执行出队操作:"<<endl;
	try
	{
		Q.DQ();
	}
	catch(char * wrong)
	{
		cout<<wrong<<endl;
	}
	cout<<"查看队头元素:"<<endl;
	cout<<Q.GQ()<<endl;
}

运行结果:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值