c语言列车调度 栈,算法:列车调度(Train)

该博客主要介绍了一个利用栈解决序列操作的问题,其中涉及到了时间复杂度为O(n)的算法实现。博主通过扫描序列并将其存储在数组中,然后逐个进行push和pop操作,确保序列的正确性。在遇到栈满或者序列不匹配的情况时,博主的算法会返回不可行的结果。此外,博主还提供了具体的C++代码实现,展示了如何在给定的时间和空间限制内完成这一任务。
摘要由CSDN通过智能技术生成

限制

1 ≤ n ≤ 1,600,000

0 ≤ m ≤ 1,600,000

时间:2 sec

空间:256 MB

解题思路:

1、先将序列扫描到一个数组num。从1-n挨个进栈,如果进栈数i == num[j],i出栈。

2、i出栈以后,判断下一个数num[j++],这时要先判断stack[top]是否等于它。如果相等,栈顶值出线,j++,再判stack[top]是否等于num[j++]  ……。

具体代码如下:

#include

//#include

#define N 1600001

int stack[N];

int num[N-1];

int out[2 * N];// 1-push;0-pop

int main()

{

int n, m;

scanf("%d %d", &n, &m);

for (int i = 0; i < n; i++)

scanf("%d", &num[i]);

int flag = 1;// 1-可行;0-no

int k = 0;// out的下标

int top = 0;// stack的下标

for (int i = 1,j = 0; i <= n && j < n; i++)

{

if (top < m) {

out[k++] = 1;

stack[top++] = i;

} else {

flag = 0;

break;

}

if (i == num[j]) {

j++;

stack[--top] = 0;

out[k++] = 0;

while (top > 0 && stack[top - 1] == num[j]) {

j++;

stack[--top] = 0;

out[k++] = 0;

}

}

}

if (flag == 0 || top != 0) printf("No\n");

else

{

for (k = 0; k < 2 * n; k++)

{

if (out[k] == 0) printf("pop\n");

else if (out[k] == 1) printf("push\n");

}

}

//system("pause");

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值