您的位置:首页 > 理论基础 > 数据结构算法

【数据结构】使用栈解决火车硬席(H)和软席(S)的调度问题

2017-10-22 22:17 337 查看

解决问题描述:

  火车调度站的入口处有n节硬席或软席车厢(分别以H和S表示)等待调度,试编写算法,输出对这n节车厢进行调度的操作(即入栈或出栈操作)序列,以使所有的软席车厢都被调整到硬席车厢之前。

源代码:

// *.cpp: 定义控制台应用程序的入口点。

#include <iostream>
using namespace std;

#define STACK_INIT_SIZE 100
#define STACKINCREASE 10
#define SElemType char
#define Status int
#define OK 1
#define OVERFLOW 0
#define ERROR -1

typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;

//构造空栈S
Status InitStack(SqStack &S) {
S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if (!S.base) return OVERFLOW;

S.top = S.base;
S.stacksize = STACK_INIT_SIZE;

return OK;
}

//取栈顶元素
Status GetTop(SqStack S, SElemType &e) {
if (S.top == S.base){     //如果栈为空,返回错误
return ERROR;
}

e = *(S.top - 1);
return OK;
}

//入栈操作
Status Push(SqStack &S, SElemType e) {
if (S.top - S.base >=S.stacksize)	{    //栈满,追加空间
S.base = (SElemType *)realloc(S.base, (S.stacksize + STACKINCREASE) * sizeof(SElemType));
if (!S.base) return ERROR;      //存储空间分配失败
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREASE;
}

*S.top = e;
S.top++;
return OK;
}

//出栈操作
Status Pop(SqStack &S, SElemType &e) {
if (S.top == S.base) return ERROR;
e = *--S.top;
return OK;
}

int main()
{
SqStack S;
InitStack(S);

char coach[80];
cout << "硬席车厢请用字母“H”表示、软席车厢请用字母“S”表示\n";
cout << "请输入车厢序列:";
cin >> coach;
cout << "输入成功!待调度车厢序列:" << coach << endl;

int i = 0, j = 0;
while (coach[i]) {
if (coach[i] == 'H') {   //如果是硬席车厢
Push(S, coach[i]);   //执行入栈操作
i++;
}
else{
coach[j] = coach[i]; //如果是软席车厢,
j++;	i++;         //将其从数组coach的第一个开始覆盖插入
}
}                            //结束循环,栈中为H,数组中前j个为S

for (j ;coach[j] ;j++)	{    //将栈中的H出栈,覆盖到coach数组第j个后面
Pop(S, coach[j]);
}

cout << "调度成功!调度后车厢序列:";
cout << coach << endl;        //输出调度之后的序列
return 0;
}

运行结果截图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: