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

解决问题描述:

  火车调度站的入口处有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;
}

运行结果截图:

  • 10
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拾年之璐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值