数据结构大作业
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
浙江大学城市学院实验报告
课程名称数据结构基础
实验项目名称实验九栈的应用
学生姓名丁汀专业班级信管1006 学号31001444
实验成绩指导老师(签名)日期
一.实验目的和要求
1、学会通过对问题的分析,设计一种合理的数据结构,并进行定义及操作的实现。
2、掌握利用栈各种操作来进行具体的实际应用。
3、加强综合程序的分析、设计能力。
二.实验内容
1、共享栈的设置,问题描述如下:
在一个数组空间stack[MaxSize]中可以同时存放两个顺序栈,栈底分别处在数组的两端,当第1个栈的栈顶指针top1等于-1时则栈1为空,当第2个栈的栈顶指针top2等于MaxSize时则栈2为空。两个栈均向中间增长,当有元素向栈1进栈时,使top1增1得到新的栈顶位置,当有元素向栈2进栈时,使top2减1得到新的栈顶位置。当top1==top2-1或top1+1==top2时,存储空间用完,无法再向任一栈做进栈操作,此时可考虑给出错误信息并停止运行。
要求:
⑴给出共享栈的顺序存储类型定义。
⑵给出共享栈的抽象数据类型定义。
⑶建立头文件test9_stack.h,包含共享栈的基本操作实现函数;建立主程序文件test9.cpp,在主函数中对共享栈的各个操作进行测试。
2、利用上述共享栈,实现火车车厢的调度模拟
设火车车厢分为三类:硬座、硬卧、软卧,分别用A、B、C表示。下图描述车厢调度的示意图,图中右端为排列无序的车厢,左端为调度后的车厢排列,使得所有软卧车厢在最前面、所有硬卧车厢在中间、所有硬座车厢在最后。
编程模拟上述车厢调度过程。
提示:两个辅助铁轨相当于两个栈,右端车厢进入用相应字符串给出,如“BBACBCAABBCAA”,左端车厢的用新生成的字符串给出。在test9_stack.h 给出模拟函数,并在主函数中进行调用测试。
3、填写实验报告,实验报告文件取名为report9.doc 。
4、上传实验报告文件report9.doc 、源程序文件test9.cpp 及test9_stack.h 到Ftp 服务器上( ftp://10.66.28.222:2007 )的文件夹下。
三. 抽象数据类型定义
ADT STACK is
Data: 元素具有ElemType 类型的栈,用标示符StackType 表示栈对象类型 Operation:
void InitStack(Stack &S)
操作结果:初始化栈S ,即构造一个空栈 S
void Push(Stack &S, ElemType item,int i)
操作结果:元素item 进栈,作为新的栈顶元素
ElemType Pop(Stack &S,int i)
操作结果:栈顶元素出栈,并返回其值
ElemType Peek(Stack S,int i)
操作结果:取S 当前栈顶元素,并返回,但元素不出栈 End STACK
四. 存储结构定义及算法思路
一、定义共建栈的相关属性
struct Stack {
ElemType *stack ; // 存栈元素
int top1; // 栈顶指示器1,直接指向栈的一端
int MaxSize; // 栈的最大长度
int top2; //栈顶指示器2,直接指向栈的另外一端
};
二、创建动态的共建栈
void InitStack(Stack &S)
{
S.MaxSize=20;
S.stack=new ElemType[S.MaxSize];
if(!S.stack){
BBACBCAABBCAA
CCCBBBBBAAAAA
cerr<<"动态申请失败!"< exit(1); } S.top1=-1; S.top2=S.MaxSize; } 三、进栈操作,将相应的元素放到对应的位置中 void Push(Stack &S, ElemType item) { if(S.top1==S.top2-1) cout<<"栈已经全满,没有多余的空间存放元素!"< else{ if(item=='B'){ S.top1++; S.stack[S.top1]=item; } if(item=='A'){ S.top2--; S.stack[S.top2]=item; } } } 四、依次取出栈中符合条件的元素 ElemType Pop(Stack &S) { if(S.top1==-1&&S.top2==S.MaxSize){ cerr<<"Stack is empty!"< exit(1); } if(S.top1!=-1){ S.top1--; return S.stack[S.top1+1]; } if(S.top2!=S.MaxSize){ S.top2++; return S.stack[S.top2-1]; } } 五. 实验结果与分析 六.心得体会 【附录----源程序】 Test9.cpp #include #include typedef char ElemType; struct Stack { ElemType *stack ; int top1; int MaxSize; int top2; }; #include "test9_stack.h" void main() { Stack s; char a[20]; int i,j,m=0,n=0; InitStack(s); cout<<"任意输入一串字符(其中A表示硬座,B表示硬卧,C表示软卧):"< i=0;