已知n辆列车的编号为1~n,在栈式结构的站台,进站顺序为1,2,…,n。编程实现:给定一个出栈序列,判断是否合法。
时间: 2024-10-06 22:04:39 浏览: 105
在栈式结构的站台上,列车按照编号从小到大的顺序依次进入,如果给定一个出栈序列,我们需要判断这个序列是否有可能是由这n辆列车按照正确的顺序出栈得到的。这个问题可以通过双端队列(deque)或者模拟堆栈的过程来解决,因为双端队列可以更方便地插入和删除元素,而不需要像普通栈那样只能在一端添加和删除。
这里是一个使用C++的解决方案:
```cpp
#include <iostream>
#include <queue> // 使用C++标准库中的双端队列
using namespace std;
bool isValid(int n, deque<int>& seq) {
queue<int> trainQueue; // 初始化一个空的火车队列
for (int i : seq) { // 遍历出栈序列
if (trainQueue.empty() || trainQueue.front() != i - 1) {
// 如果当前出栈的列车编号不是比前一辆列车大1,或者队列为空,则不可能是合法序列
return false;
}
trainQueue.push(i); // 否则,将列车入队
}
// 确保所有列车都已出栈
if (trainQueue.size() != n) {
return false;
}
return true;
}
int main() {
int n = 5;
deque<int> seq = {4, 3, 0, 6, 2, 1}; // 测试序列
cout << "Is the sequence valid? " << (isValid(n, seq) ? "Yes" : "No") << endl;
return 0;
}
```
在这个程序中,我们遍历输入的出栈序列`seq`,每次检查当前的列车编号是否等于前一辆列车编号加一。如果是,就将它加入队列;如果不是,说明序列无效。当所有的列车都被出栈并且队列的大小与车辆总数一致时,序列才被认为是有效的。
阅读全文