【题目要求】
1.问题:
一列火车要将n节车厢分别送往n个车站,车站按照n,n-1,…,1的编号次序经过车站。假设车厢的编号就是其目的地车站的编号。 2.要求:
1.问题:
一列火车要将n节车厢分别送往n个车站,车站按照n,n-1,…,1的编号次序经过车站。假设车厢的编号就是其目的地车站的编号。 2.要求:
给定一个任意的车厢排列次序。重新排列车厢,使其按照从1到n的次序排列。规定重排调度时车厢只能从入轨到缓冲铁轨,或者从缓冲铁轨到出轨。
#include<iostream>
#include<stack>
#include<vector>
using namespace std;
int main() {
int n, temp, s= 1, stack_count= 0;
int stack_sum= 0;
cout<< "请输入火车的节数:"<< endl;
cin>> n;
vector<int> v;
stack<int>* vs= new stack<int>[n- 1];
// 输入火车原本的排列,存入到vector v中
cout<< "请输入火车的排列顺序:"<< endl;
cout<< "(最右边为先开出的火车)"<< endl;
for (int i= 0; i< n; i++) {
cin>> temp;
v.push_back(temp);
}
cout<< endl;
for (int i= n- 1; i>= 0; i--) {
cout<< endl;
if (i!= n- 1) { // 处理前判断栈中有没符合条件的
while (1) {
bool find0= false;
for (int m= 0; m< stack_count; m++) {
if (vs[m].empty()== true) continue;
if (vs[m].top()== s) {
cout<< "将第["<< s<< "]号火车从第["<< m+ 1<< "]个缓冲轨中驶出"<< endl;
cout<< endl;
vs[m].pop();
s++;
find0== true;
}
}
if (find0== false) break;
}
}
// 如果火车头对应,就将火车驶出轨道
cout<< "对 队列中的 第["<< v[i]<< "]号火车进行操作:"<< endl;
if (v[i]== s) {
s++;
cout<< "第["<< v[i]<< "]号火车直接驶出"<< endl;
} else { // 火车头不对应
bool flag= false; // 如果已存在的栈中有栈顶大于火车头的,驶入栈中
bool flag1= false;
for (int j= 0; j< stack_count; j++) {
if (vs[j].empty()) {
cout<< "将["<< v[i]<< "]号车厢驶入["<< j+ 1<< "]号缓冲轨中"<< endl;
vs[j].push(v[i]);
cout<< "";
flag1= true;
break;
}
}
if (flag1== false) {
for (int j= 0; j< stack_count; j++) {
if (vs[j].top()>= v[i]) {
cout<< "将["<< v[i]<< "]号车厢驶入["<< j+ 1<< "]号缓冲轨中"<< endl;
vs[j].push(v[i]);
cout<< "";
flag= true;
break;
}
}
}
// 驶入新的栈中
if (flag== false&& flag1== false) {
cout<< "将["<< v[i]<< "]号车厢驶入["<< stack_count+ 1<< "]号缓冲轨中"<< endl;
vs[stack_count].push(v[i]);
stack_count++;
}
}
}
cout<< endl;
while (1) { // 遍历栈中的每一个元素
bool find= false;
for (int i= 0; i< stack_count &&!vs[i].empty(); i++) {
if (vs[i].top()== s) {
cout<< "将["<< vs[i].top()<< "]"<< "号火车从["<< i+ 1<< "]号缓冲轨中驶出"<< endl;
cout<< endl;
vs[i].pop();
find= true;
s++;
}
}
if (find== false) break;
}
cout<< "所需要的缓冲轨的数量为:"<< stack_count<< endl;
cout<< endl;
return 0;
}