作者:老九—技术大黍
产品:查看原文
社交:CSDN
公众号:老九学堂(新手有福利)
特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系笔者授权
问题描述
某火车调度站的铁道联接结构如图所示:
其中,A为入口,B为出口,S为中转盲端。所有铁道均为单轨单向式:火车行驶的方向只能是从A到S,再从S到B;另外,不允许超车。因为车厢可在S中驻留,所以它们从B端驶出的次序,可能与从A端驶入的次序不同。不过S的容量有限,同时驻留的车厢不得超过m节。
设某列车由编号依次为{1, 2, …, n}的n节车厢组成。调度员希望知道,按照以上交通规则,这些车厢能否以{a1, a2, …, an}的次序,重新排列后从B端驶出。如果可行,应该以怎样的次序操作?
输入
共两行。
第一行为两个整数n,m。
第二行为以空格分隔的n个整数,保证为{1, 2, …, n}的一个排列,表示待判断可行性的驶出序列{a1,a2,…,an}。
输出
若驶出序列可行,则输出操作序列,其中push表示车厢从A进入S,pop表示车厢从S进入B,每个操作占一行。
若不可行,则输出No。
样例
Input
Output
代码实现
定义顺序栈结构
#include "stdio.h"
#include "stdlib.h"
#define MAX_SIZE 255 //数组最大长度
//顺序栈结构
typedef struct sqStack
{
int elems[MAX_SIZE];
int top; //栈顶,数组下标
int length; //栈的长度
}SqStack;
void init(SqStack* s)
{
s->top = -1;
s->length = 0;
}
int push(SqStack* s, int elem)
{
if(s->top == MAX_SIZE - 1)/*栈满*/
{
return 0;
}
s->length++;
s->top++; /*栈顶指针增加1*/
s->elems[s->top] = elem; /*将新插入元素赋值给栈顶空间*/
return 1;
}
int pop(SqStack* s)
{
if(s->top == 0) return 0;
int elem = s->elems[s->top]; /*将要删除的栈顶元素赋值给e*/
s->top--; /*栈顶指针减1*/
s->length--;
return elem;
}
int main()
{
int a[50];
int operation[50];
int i = 0;
int m, n, flag = 0;
printf("输入火车数量:");
scanf("%d",&n); //火车数量n
printf("输入车站最大停留数量:");
scanf("%d",&m); //最大停留火车数量m(栈的上限)
printf("输入出站序列:\n");
for (i = 0; i < n; i++)
{
scanf("%d",&a[i]); //输入{1,2,...,n}
}
int step = 0, b = 1;
//栈的创建并赋值
SqStack s;
init(&s);
push(&s,0);
//模拟火车进栈调度
for (i = 0; i < n; i++)
{
while(s.elems[s.top] < a[i])
{
push(&s,b++);
operation[step++] = 1;
}
//超出栈的上限(栈底放入0,上限+1)
if (s.length > m + 1)
{
printf("no\n");
flag = 1; //标识无解决方案可满足条件
break;
}
//直到找到与输入的出栈顺序相等的值
if (s.elems[s.top] == a[i])
{
pop(&s);
operation[step++] = 0;
}
}
if (flag != 1)
{
if (s.length == 1 && s.top == 0)
{
for (i = 0; i < step; i++)
{
if (operation[i] == 1)
printf("push\n");
else
printf("pop\n");
}
}
else
printf("no\n");
}
return 0;
}
总结
我们代码实现肯定不是最好,如果不足之处,请大家指正和补充。
最后
感觉有用的同学,请记得给大黍❤️关注+点赞+收藏+评论+转发❤️
作者:老九学堂—技术大黍
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。