火车站调度问题

【题目要求】 
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;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值