栈和队列的应用车厢排序的设计与实现Word格式文档下载.docx
- 文档编号:17118663
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:17
- 大小:95.57KB
栈和队列的应用车厢排序的设计与实现Word格式文档下载.docx
《栈和队列的应用车厢排序的设计与实现Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《栈和队列的应用车厢排序的设计与实现Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
共享栈结构体定义
structStack{
ElemType*stack;
inttop1,top2;
//表示栈顶元素的位置
}S;
共享栈抽象数据类型定义
ADTSTACK{
数据对象:
D={ai|ai(∈D0,i=1,2,...,n,n>
=0}
数据关系:
R={<
ai-1,ai>
|ai-1,ai∈D0,i=2…n}
约定其中a1端为栈顶,an端为栈底
基本操作:
StatusInitStack(Stack&
S)
//构造一个空栈
StatusClearStack(Stack&
S,intk)
//清空栈。
当k=1或2时对应栈1或栈2被清空,k=3时两个栈均被清空
intStackEmpty(Stack&
//判断栈是否为空。
当k=1或2时判断对应的栈1或栈是否为空;
k=3时,判断两个栈是否同时为空。
若判断结果为空则返回1,否则返回0
StatusGetTop(Stack&
S,intk,ElemType&
e)
//取栈顶元素。
若栈不为空,根据k得值用e返回栈1或栈2的栈顶元素,并返回OK;
否则返回ERROR
StatusPush(Stack&
S,intk,ElemTypee)
//进栈。
当k=1或2时对应向栈1或栈2的顶端插入元素e,并返回OK;
否则返回ERROR
StatusPop(Stack&
//出栈。
若栈不为空,根据k的值删除栈1或栈2的栈顶元素,用e返回其值,并返回OK;
}ADTSTACK
共享栈操作测试程序功能模块结构图
共享栈操作测试程序函数调用结构图
共享栈操作测试程序运行结果与分析
输入对应的数字,测试相应的功能
队列结构体定义
typedefstructqNode
{
chardata;
structqNode*next;
}QNode,*QueuePtr;
typedefstruct{
QNode*front;
//队头指针
QNode*rear;
//队尾指针
}LinkQueue;
队列抽象数据类型定义
ADTQUEUE{
约定其中a1端为队列头,an端为队列尾
StatusInitQueue(LinkQueue&
q)
//构造一个空队列
StatusEnQueue(LinkQueue&
q,ElemTypee)
//插入元素e为q的新的队尾元素
StatusDeQueue(LinkQueue&
q,ElemType&
//若队列不空,则删除q的队头元素,用e返回其值,并返回OK;
StatusDestroyQueue(LinkQueue&
//销毁队列q
}ADTQUEUE
火车调度函数调用结构图
火车调度思路
将字符串中的字符’B’进入栈1,字符’A’进入栈2,字符’C’进入队列,栈1的元素依次出栈进入队列,栈2的元素依次出栈进入队列,遍历队列并输出每个元素
火车调度运行结果与分析
难点
现象:
测试共享栈时未输入进栈的字符就直接执行了下一条语句
原因:
忽视了输入之后的回车也是个字符
解决:
在输入进栈的字符前,增加一句getchar()
存在的问题及可改进之处
问题:
输入非法字符无法使程序正常运行
改进:
可以增加对输入的非法字符的处理
程序清单
test4_1.cpp
#include<
stdio.h>
stdlib.h>
typedefcharElemType;
typedefintStatus;
#defineOK1
#defineERROR0
#defineMaxSize20
#defineOVERFLOW-2
#include"
SeqStack.h"
voidmenu(){
printf("
输入1,清空栈\n"
);
输入2,判断栈是否为空\n"
输入3,取栈顶元素\n"
输入4,进栈\n"
输入5,出栈\n"
输入0,退出\n"
}
intmain(){
inti,k;
chare;
if(InitStack(S))
成功创建空栈\n"
);
menu();
while(scanf("
%d"
&
i)){
switch(i){
case1:
printf("
输入1清空栈1,输入2清空栈2,输入3均清空\n"
scanf("
k);
ClearStack(S,k);
printf("
输入6,返回;
break;
case2:
输入1判断栈1,输入2判断栈2,输入3均判断\n"
if(StackEmpty(S,k))
空栈\n"
else
非空栈\n"
输入0,退出"
case3:
输入1取栈1,输入2取栈2\n"
GetTop(S,k,e);
栈顶元素为%c\n"
e);
case4:
getchar();
输入进栈元素\n"
e=getchar();
输入1操作栈1,输入2操作栈2\n"
Push(S,k,e);
case5:
Pop(S,k,e);
%c\n"
case6:
system("
cls"
menu();
break;
case0:
exit(0);
break;
default:
请输入0-5!
"
}
}
SeqStack.h
S)//构造一个空栈
{
S.stack=(ElemType*)malloc(MaxSize*sizeof(ElemType));
if(!
S.stack)exit(OVERFLOW);
//存储分配失败
S.top1=-1;
S.top2=MaxSize;
returnOK;
S,intk)//清除空。
当k=1或2时对应栈1或栈2被清空,k=3时两个栈均被清空
if(k==1)
elseif(k==2)
elseif(k==3){
}
S,intk)//判断栈是否为空。
returnS.top1==-1;
returnS.top2==MaxSize;
elseif(k==3)
return(S.top1==-1)&
&
(S.top2==MaxSize);
else{
printf("
k的值不正确!
returnERROR;
e)//取栈顶元素。
if(k==1){
if(S.top1==-1){
栈1是空栈!
\n"
e=S.stack[S.top1];
elseif(k==2){
if(S.top2==MaxSize){
栈2是空栈!
e=S.stack[S.top2];
S,intk,ElemTypee)//进栈。
if(S.top1==S.top2-1){
存储空间已用完!
S.top1++;
S.stack[S.top1]=e;
S.top2--;
S.stack[S.top2]=e;
e)//出栈。
printf("
returnERROR;
S.top1--;
returnOK;
S.top2++;
test4_2.cpp
//队头指针
//队尾指针
LinkQueue.h"
LinkQueueq;
InitQueue(q);
//构造一个空队列Q
InitStack(S);
//构造一个空栈S
chara[100],e;
inti=0,m=0,n=0;
//m表示字符'
B'
的个数,n表示字符'
A'
的个数
任意输入一串字符,其中A表示硬座,B表示硬卧,C表示软卧\n"
scanf("
%s"
a);
while(a[i]=='
||a[i]=='
C'
){
if(a[i]=='
){//字符'
进入栈1
e=a[i];
m++;
Push(S,1,a[i]);
进入栈2
n++;
Push(S,2,a[i]);
i++;
if(m+n==MaxSize){
共享栈存储空间已用完!
exit(0);
EnQueue(q,e);
//字符'
进队列
while(Pop(S,1,e))//栈1中的元素依次出栈进队列
EnQueue(q,e);
while(Pop(S,2,e))//栈2中的元素依次出栈进队列
if(q.front==q.rear)//空队列
return0;
QueuePtrp=q.front->
next;
while(p!
=q.rear)//非空队列
{
%c"
p->
data);
p=p->
LinkQueue.h
当k=1或2时对应向栈1或栈2的顶端插入元素e
若栈不为空,根据k的值删除栈1或栈2的栈顶元素,用e返回其值
q)//构造一个空队列q
q.front=q.rear=(QueuePtr)malloc(sizeof(QNode));
q.front)exit(OVERFLOW);
q.front->
next=NULL;
q,ElemTypee)//插入元素e为q的新的队尾元素
QueuePtrp=(QueuePtr)malloc(sizeof(QNode));
p)
exit(OVERFLOW);
p->
data=e;
q.rear->
next=p;
q.rear=p;
e)//若队列不空,则删除q的队头元素,用e返回其值,并返回OK;
if(q.front==q.rear)
returnERROR;
QueuePtrp;
p=q.front->
e=p->
data;
next=p->
if(q.rear==p)
q.rear=q.front;
free(p);
}
q)//销毁队列q
while(q.front)
q.rear=q.front->
free(q.front);
q.front=q.rear;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 队列 应用 车厢 排序 设计 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)