实验任务
这是一个普通的火车站,有一个供列车车厢调转位置的栈型铁轨:
进站的列车编号为 1 2 3 …n,栈型铁轨可容纳 m 台车厢。
车站管理员喜欢是个糊涂虫,经常把列车运行记录弄错。这是十分严重的问题。
现在,给出车站管理员记录的列车车厢的出站编号顺序,你能判断出他是否有记错吗?
数据输入
输入第一行为两个整数 n m(0
数据输出
若车站管理员记录出错,请输出“ERROR”及第一个出现错误的车厢号,用空格隔开。
否则输出“OK”
输入示例
7 2
1 2 4 5 3 6 7
6 3
1 2 5 3 4 6
输出示例
OK
ERROR 3
解题思路
见注释
参考代码
#include <iostream>
#include <cstdio>
#include <stack>
const int maxn = 10010;
int target[maxn];
using namespace std;
int main()
{
int n,m,i;
while (~scanf("%d %d",&n,&m)){
for (i = 1;i <= n;i++)
scanf("%d",&target[i]); //输入车厢出站顺序
stack<int> s;
int u = 1,v = 1; // u代表进站车厢编号,v代表出站车厢数组的索引值
bool flag = true;
while (v <= n){//出站n个
if (u == target[v]) //进站与出站编号相同
u++,v++; //都后移一位
else if (!s.empty() && s.top() == target[v]) //栈非空 且 栈顶元素编号等于出站编号,则栈顶元素出栈,出站车厢后移一位
s.pop(),v++;
else if (u <= n && s.size() < m) //进站车厢编号不大于n 且 栈中元素少于m个
s.push(u++); //进站车厢进栈等待
else{
flag = false; //上述都不满足,则ERROR
break;
}
}
flag?printf("OK\n"):printf("ERROR %d\n",target[v]);
}
return 0;
}