C#(链栈)实现火车重排问题

来源:互联网 发布:必修三数学算法初步 编辑:程序博客网 时间:2024/05/22 03:13

实现链栈的重排:
我创建了一个TrainRoad的类,这个类就是用来进行重排操作的类,这个类主要有三个函数,1重排函数,2是进入缓冲轨道函数,3是出缓冲轨道函数,下面我们来看代码的实现:

class TrainRoad{    private IStack<int>[] _allRoad;    private int _nextOut = 1;    private int _UniqueMaxSize;    private int _len;    private int _minRoad = 0;    private int _minTrain;    // 初始化总共的轨道数,n个缓冲+1个最终,缓冲的最大容量    public TrainRoad(int n, int max)     {        _allRoad = new LinkStack<int>[n + 1];        for (int i = 0; i < n + 1; i++)         {            _allRoad[i] = new LinkStack<int>();        }        _len = n;        _UniqueMaxSize = max;    }    // 重排函数    public void Railroad(int[] p)     {        int len = p.Length;        _minTrain = len;        for (int i = 0; i < len; i++)         {            if (p[i] == _nextOut)            {                Console.WriteLine("Move Car {0} from input to output", p[i]);                _nextOut++;                while (_minTrain == _nextOut)                {                    this.OutRoad(2 * len);                    _nextOut++;                }            }            else             {                this.IntoRoad(p[i]);            }        }    }    // 进入缓冲轨道    public void IntoRoad(int train)     {        int best = 0;        for (int i = 0; i < _len; i++)         {            if (!_allRoad[i].IsEmpty() && _allRoad[i].Length <= _UniqueMaxSize)             {                if (train < _allRoad[i].StackTop)                {                    best = i;                    Console.WriteLine("Move Car {0} from input to holding track {1}", train, i);                    break;                }            }            else if (_allRoad[i].IsEmpty())            {                best = i;                Console.WriteLine("Move Car {0} from input to holding track {1}", train, i);                break;            }            else             {                continue;            }        }        _allRoad[best].Push(train);        if (train < _minTrain)         {            _minTrain = train;            _minRoad = best;        }    }    // 将车厢移动到最终轨道    public void OutRoad(int len)     {        int train = _allRoad[_minRoad].StackTop;        Console.WriteLine("Move Car {0} from holding track {1} to output", _minTrain, _minRoad);        _allRoad[_minRoad].Pop();        _minTrain = len;        _minRoad = 0;        for (int i = 0; i < _len; i++)         {            if (!_allRoad[i].IsEmpty())             {                int min = _allRoad[i].StackTop;                if (min < _minTrain)                {                    _minTrain = min;                    _minRoad = i;                }            }        }    }}
0 0