《数据结构》实验三:栈和队列实验 (实验报告)

来源:互联网 发布:淘宝上卖宠物用品货源 编辑:程序博客网 时间:2024/05/16 06:34

一.实验目的

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

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

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

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

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


二.实验内容

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

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

3.编程实现一个十进制数转换成二进制数。要求,要主程序中输出一个10进度数,输出其对应的2进制数序列。

    前两题是必做题,第3题是选做题。


三.实验结果

实验1:

#include<iostream.h>
const int StackSize=10;

template<class DataType>
class SeqStack
{
public:
SeqStack(){top=-1;}
SeqStack(int a[],int n);
~SeqStack(){}
void Push(DataType x);
DataType Pop();
DataType GetTop(){if(top!=-1) return data[top];}
int Empty(){return (top==-1)? 1 : 0;}
private:
DataType data[StackSize];
int top;
};

template<class DataType>
SeqStack<DataType>::SeqStack(int a[],int n)
{
if(n>StackSize) throw"参数非法";
for(int i=0;i<n;i++)
data[i]=a[i];
top=n-1;
}

template<class DataType>
void SeqStack<DataType>::Push(DataType x)
{
if(top==StackSize-1) throw"上溢";
data[++top]=x;
}

template<class DataType>
DataType SeqStack<DataType>::Pop()
{
DataType x;
if(top==-1) throw"下溢";
x=data[top--];
return x;
}

void main()
{
int a[5]={2,3,5,7,11};
SeqStack<int> S(a,5);
if(S.Empty())
cout<<"栈为空"<<endl;
else
cout<<"栈非空"<<endl;
cout<<"对13执行入栈操作"<<endl;
S.Push(13);
cout<<"栈顶元素为:"<<endl;
cout<<S.GetTop()<<endl;
cout<<"执行一次出栈操作"<<endl;
S.Pop();
cout<<"栈顶元素为:"<<endl;
cout<<S.GetTop()<<endl;
}



实验2:

#include<iostream.h>

template<class DataType>
struct Node
{
DataType data;
Node<DataType> *next;
};

template<class DataType>
class LinkQueue
{
public:
LinkQueue();
~LinkQueue();
void EnQueue(DataType x);
DataType DeQueue();
DataType GetQueue();
int Empty();
private:
Node<DataType> *front,*rear;
};

template<class DataType>
LinkQueue<DataType>::LinkQueue()
{
Node<DataType> *s=NULL;
s=new Node<DataType>;
s->next=NULL;
front=rear=s;
}

template<class DataType>
LinkQueue<DataType>::~LinkQueue()

Node<DataType> *p=NULL;
while(front!=NULL)
{
p=front;
front=front->next;
delete p;
}
}

template<class DataType>
void LinkQueue<DataType>::EnQueue(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 LinkQueue<DataType>::DeQueue()
{
Node<DataType> *p;
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 LinkQueue<DataType>::GetQueue()
{
if(front!=rear)
return front->next->data;
}

template<class DataType>
int LinkQueue<DataType>::Empty()
{
if(front==rear)
return 1;
else
return 0;
}

void main()
{
LinkQueue<int> Q;
if(Q.Empty())
cout<<"队列为空"<<endl;
else cout<<"队列非空"<<endl;
cout<<"元素10和15执行入队操作!"<<endl;
Q.EnQueue(10);
Q.EnQueue(15);
cout<<"查看队头元素:";
cout<<Q.GetQueue()<<endl;
cout<<"执行出队操作!"<<endl;
Q.DeQueue();
cout<<"查看队头元素:"<<Q.GetQueue()<<endl;
}



三.实验总结

       通过这一次的实验,我不仅实现了栈和队列的算法,还解决了上次作业遗留下来的问题。通过百度,我知道了“ ? : ”操作符是需要返回值的,所以问号后面的和冒号后面的都是需要一个表达式,而不是一个完整的语句。那么 top==NULL?return 1:return 0; 语句就应该改为 return (top==-1)?1:0; 语句,程序才得以运行成功。当然,除了这一种方法以外,还可以使用 if else语句,例子在本次实验的实验2中。

0 0
原创粉丝点击