1.1、共享栈的设置,问题描述如下:
在一维数组空间stack[MaxSize]中可以同时存放两个顺序栈,栈底分别处在数组的两端,当第1个栈的栈顶指针top1等于-1时则栈1为空,当第2个栈的栈顶指针top2等于MaxSize时则栈2为空。两个栈均向中间增长,当有元素向栈1进栈时,使top1增1得到新的栈顶位置,当有元素向栈2进栈时,使top2减1得到新的栈顶位置。当top1==top2-1或top1+1==top2时,存储空间用完,无法再向任一栈做进栈操作,此时可考虑给出错误信息并停止运行。
要求:
⑴ 给出共享栈的顺序存储类型定义。
⑵ 给出共享栈的抽象数据类型定义。
⑶ 建立头文件SeqStack.h,包含共享栈的基本操作实现函数;建立主程序文件test4_1.cpp,在主函数中对共享栈的各个操作进行测试。
//返回函数状态
typedef int Status;
//元素类型
typedef int ElemType;
//共享栈栈结构
typedef struct {
ElemType *data;
int top1; // 栈1栈顶指针
int top2; // 栈2栈顶指针
int stacksize; //当前已分配的存储空间
} ShareStack;
//创建共享栈
Status Init_Share_Stack(ShareStack &s) ;
//判断共享栈是否为空
Status Empty_Share_Stack(ShareStack &s) ;
//入栈
Status Push_Share_Stack(ShareStack &s, ElemType e, int Stack_Number) ;
//出栈
Status Pop_Share_Stack(ShareStack &s, ElemType &e, int Stack_Number) ;
//共享栈长度
Status Length_Share_Stack(ShareStack &s) ;
//共享栈栈顶元素
ElemType Get_Share_Stack(ShareStack &s, ElemType &e, int Stack_Number);
//清空栈
Status Clear_Share_Stack(ShareStack &s) ;
//打印共享栈所有元素
Status Traverse_Share_Stack(ShareStack &s) ;
//销毁共享栈
Status Destroy_Share_Stack(ShareStack &s) ;
1.2、利用上述共享栈,实现火车车厢的调度模拟
设火车车厢分为三类:硬座、硬卧、软卧,分别用A、B、C表示。下图描述车厢调度的示意图,图中右端为排列无序的车厢,左端为调度后的车厢排列,使得所有软卧车厢在最前面、所有硬卧车厢在中间、所有硬座车厢在最后。
编程模拟上述车厢调度过程。
提示:两个辅助铁轨相当于两个栈,右端车厢进入用相应字符串给出,如“BBACBCAABBCAA”,左端车厢的序列放在一个链式存储的队列中。在LinkQueue.h给出模拟函数,并在test4_2.cpp中进行调用测试。
![
//返回函数状态
typedef int Status;
//元素类型
typedef char ElemType;
//共享栈栈结构
typedef struct {
ElemType *data;
int top1; // 栈1栈顶指针
int top2; // 栈2栈顶指针
int stacksize; //当前已分配的存储空间
} ShareStack;
//链式存储
typedef struct QNode{
ElemType data;
struct QNode *next;
}QNode,*QueuePtr;
//队列
typedef struct{
QueuePtr front; //队头指针
QueuePtr rear; //队尾指针
}LinkQueue;
//创建共享栈
Status Init_Share_Stack(ShareStack &s);
//入栈
Status Push_Share_Stack(ShareStack &s, ElemType e, int Stack_Number);
//出栈
Status Pop_Share_Stack(ShareStack &s, ElemType &e, int Stack_Number) ;
Status Length_Share_Stack_A(ShareStack &s) ;
Status Length_Share_Stack_B(ShareStack &s) ;
//清空栈
Status Clear_Share_Stack(ShareStack &s) ;
//销毁共享栈
Status Destroy_Share_Stack(ShareStack &s);
//创建队列
Status InitQueue(LinkQueue &Q)
//清空队列
Status ClearQueue(LinkQueue &Q);
//销毁队列
Status DestroyQueue(LinkQueue &Q) ;
//判断队列是否为空
Status QueueEmpty(LinkQueue &Q) ;
//获取队列长度
int QueueLength(LinkQueue &Q) ;
//入队
Status EnQueue(LinkQueue &Q, ElemType e) ;
//出队
Status DeQueue(LinkQueue &Q, ElemType e) ;