数据结构实验报告-栈和队列

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2007级数据结构实验报告
实验名称:实验2——栈和队列
学生姓名:
班级:
班内序号:
学号:
日期:2008年11月X日
1.实验要求
题目1
根据栈和队列的抽象数据类型的定义,按要求实现一个栈或一个队列。

要求:1、实现一个共享栈
2、实现一个链队列
3、编写测试main()函数测试线性表的正确性
2. 程序分析
2.1 存储结构
ADT Stack
Data
栈中元素具有相同类型及后进先出特性,相邻元素具有前驱和后继关系Operation
InitStack
前置条件:栈不存在
输入:无
功能:栈的初始化
输出:无
后置条件:构造一个空栈
DestroyStack
前置条件:共享空间已存在
输入:无
功能:销毁两栈共享的数组空间
输出:无
后置条件:将两栈共享的数组空间释放
Push
前置条件:共享空间已存在
输入:栈号i,元素值x
功能:在栈i顶插入一个元素x
输出:若插入不成功,则抛出插入异常
后置条件:若插入成功,则栈i顶插入了一个栈顶元素 Pop
前置条件:共享空间已存在
输入:栈号i
功能:在栈i中删除栈顶元素
输出:若删除不成功,则抛出删除异常
后置条件:若删除成功,则栈i中删除了栈顶元素
GetTop
前置条件:共享空间已存在
输入:栈号i
功能:读取栈i当前的栈顶元素
输出:若栈i不空,返回栈i当前的栈顶元素值
后置条件:两栈均不变
Empty
前置条件:共享空间已存在
输入:栈号i
功能:判断栈i是否为空栈
输出:若栈i为空栈,返回1;否则返回0
后置条件:两栈均不变
endADT
ADT Stack
Data
队列中元素具有相同类型及后进后出特性,相邻元素具有前驱和后继关系Operation
InitQueue
前置条件:队列不存在
输入:无
功能:初始化队列
输出:无
后置条件:创建一个空队列
EnQueue
前置条件:队列已存在
输入:元素值s
功能:在队尾插入一个元素
输出:无
后置条件:如果插入成功,队尾增加了一个元素
DeQueue
前置条件:队列已存在
输入:无
功能:删除队头元素
输出:如果删除成功,返回被删元素值,否则,抛出删除异常
后置条件:如果删除成功,队头减少了一个元素
GetQueue
前置条件:队列已存在
输入:无
功能:读取队头元素
输出:若队列不空,返回队头元素
后置条件:队列不变
Empty
前置条件:队列已存在
输入:无
功能:判断队列是否为空
输出:如果队列为空,返回,否则,返回
后置条件:队列不变
endADT
2.2 关键算法分析
在一个程序中如果需要同时使用具有相同数据类型的两个栈时,如何处理:
使用一个数组来存储两个栈,让一个栈的栈底为该数组的始端,另一个栈的栈底为该数组的末端,每个栈从各自的端点向中间延伸,如图所示。

其中,top1和top2分别为栈1和栈2的栈顶指针,StackSize为整个数组空间的大小,栈1的底固定在下标为0的一端;栈2的底固定在下标为StackSize-1的一端。

1;插入算法
在栈i中插入元素x的算法用伪代码描述为:
1.如果栈满,则抛出上溢异常;
2.判断是在栈1插入还是在栈2插入;
若是在栈1插入,则栈顶指针top1加1,在top1处填入x;
若是在栈2插入,则栈顶指针top2加1,在top2处填入x;
2.1 若栈1为空栈,则抛出下溢异常;
2.2 删除并返回栈1的栈顶元素;
3. 若是在栈2删除,则
3.1 若栈2为空栈,则抛出下溢异常;
3.2 删除并返回栈2的栈顶元素;
队列的链接存储结构称为链队列。

3;创建链队列(即构造函数)的算法
4;入队算法 (b) 非空链队列
(a) 空链队列
出队算法用伪代码描述为:
1. 如果队空,则抛出下溢异常;
2. 暂存队头元素所在结点;
3. 将队头元素所在结点摘链;
4. 如果被删除的队头元素同时也是队尾元素,则修改队尾指针;
链队列的出队算法:
3.程序运行结果
1、测试主函数流程:
//BothStackMain.cpp
#include <iostream.h>
#include "Head.h" //引入函数头文件
void main()
{ BothStack<double> a;
if (!a.Empty(1)) //判断栈是否为空
{ cout<<"栈为空,对栈进行压栈操作:"<<endl;
try
{ a.Push(1,10.9);
cout<<"栈的栈顶元素为:"<<endl;
cout<<a.GetTop(1)<<endl; //读取栈顶元素
cout<<"对栈进行压栈操作:"<<endl;
a.Push(1,12.3);
}
catch(char* str)
{ cout<<str<<endl; }
cout<<"栈的栈顶元素为:"<<endl;
cout<<a.GetTop(1)<<endl;
cout<<"对栈执行出栈操作:"<<endl; //出栈操作
a.Pop(1);
cout<<"此时栈中的栈顶元素为:"<<endl;
cout<<a.GetTop(1)<<endl;
}
else
{ cout<<"栈非空"<<endl; }
if (!a.Empty(2))
{ cout<<"栈为空,对栈进行压栈操作:"<<endl;
try
{ a.Push(2,5.6);
cout<<"栈的栈顶元素为:"<<endl;
cout<<a.GetTop(2)<<endl;
cout<<"对栈进行压栈操作:"<<endl;
a.Push(2,4.07668);
}
catch(char* str)
{ cout<<str<<endl; }
cout<<"栈的栈顶元素为:"<<endl;
cout<<a.GetTop(2)<<endl;
cout<<"对栈进行出栈操作:"<<endl;
a.Pop(2);
cout<<"此时栈中的栈顶元素为:"<<endl;
cout<<a.GetTop(2)<<endl;
}
else
{ cout<<"栈非空"<<endl; }
}
//LinkQueueMain.cpp
#include"Head.h"
#include<iostream.h>
void main()
{ LinkQueue<char> a;
if (a.Empty())
{ cout<<"队空,执行入队操作直到用户输入“p”为止:"<<endl;
try
{ char t;
cin>>t;
for(;t!='p';cin>>t)
{ a.EnQueue(t); } //入队操作
cout<<"查看队头元素:"<<endl;
cout<<a.GetQueue()<<endl; //读队头元素
}
catch(char* str)
{ cout<<str<<endl; }
cout<<"查看队中所有元素:"<<endl;
try
{ while(!a.Empty())
{ cout<<a.GetQueue()<<endl;
a.DeQueue(); //出队操作
}
}
catch(char* str)
{ cout<<str<<endl; }
}
else
{ cout<<"队列不空"<<endl; }
a.~LinkQueue();
}
主函数流程:
//BothStackMain.cpp
//LinkQueueMain.cpp
2、测试结论
测试结果:
1:
2:
实验结果表明程序基本无bug,各成员函数工作正常。

相关文档
最新文档