using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] train = new int[] { 5, 8, 1, 7, 4, 2, 9, 6, 3 };
            //定义三个缓冲轨
            LinkStack<int>[] H = new LinkStack<int>[3];
            H[0] = new LinkStack<int>();
            H[1] = new LinkStack<int>();
            H[2] = new LinkStack<int>();
        
            int num = 1;      //当前要进入铁轨的车厢号
            int minT = 10;    //缓冲轨中编号最小的车厢
            int staynum = 0;  //minT车厢对应的缓冲轨
            for (int j = 8; j <= 0; j--)
            {
                if (minT != num)  
                {
                    if (train[j] == num)  //将车厢移入铁轨
                    {
                        Console.WriteLine("将车厢{0}移入铁轨", train[j]);
                        num++;
                    }
                    else  //将车厢移入缓冲轨
                    {
                        Hold(train[j], ref minT, ref staynum, ref H, 3, 9);
                    }
                }
                else  //将车厢从缓冲轨移入铁轨
                {
                    Output(ref minT, ref staynum, ref H, 3, 9);
                }            }
        }        //将车厢放入缓冲轨并且修改minT和staynum值
        public static void Hold(int c, ref int minT, ref int staynum, ref LinkStack<int>[] H, int k, int n)
        {
            int x;   //车厢索引 
            int Besttrain = n + 1;  //用来寻找最优缓冲轨 
            int num = 0;
            for (int i = 0; i < k; i++)
            {
                if (!H[i].IsEmpty()) //缓冲轨不为空
                {
                    x = H[i].StackTop;  //栈顶元素
                    if (c < x && x <= minT)
                    {
                        Besttrain = i;
                        staynum = Besttrain;
                        minT = x;
                        num = 1;
                    }
                }
                else
                {
                    Besttrain = i;
                    num = 1;
                    break;
                }
            }
            if (num == 0)
            {
                Console.WriteLine("无可用缓冲轨,需添加缓冲轨");
            }
            else
            {
                H[Besttrain].Push(c);
                Console.WriteLine("将车厢{0}移入缓冲轨{1}", c, Besttrain + 1);
            }
        }
        //将车厢从缓冲轨移入铁轨并修改minT和staynum值
        public static void Output(ref int minT, ref int staynum, ref LinkStack<int>[] H, int k, int n)
        {
            //for(int i=1;i<=k;i++)
            Console.WriteLine("将缓冲轨{0}顶部车厢{1}移入铁轨", staynum, minT);
            H[staynum].Pop();
            minT =H[0].StackTop ;
            staynum = 0;
            for (int i = 0; i < k-1; i++)
            {
                if (minT > H[i + 1].StackTop)
                {
                    minT = H[i + 1].StackTop;
                    staynum = i + 1;
                }
            }
        }
    }
}

解决方案 »

  1.   

    F9 F10 F11
      

  2.   

     LinkStack 是什么?
      

  3.   

    你的LinkStack应该是自已写的链栈吧,代码呢?
      

  4.   

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace ConsoleApplication2
    {
        public class LinkStack<T> : IStack<T> where T : IComparable<T>
        {
            private readonly SLinkList<T> _lst;
            public LinkStack()
            {
                _lst = new SLinkList<T>();
            }
            public int Length
            {
                get { return _lst.Length; }
            }
            public T StackTop
            {
                get
                {
                    if (_lst.Length == 0)
                        throw new Exception("栈为空");
                    return _lst[0];
                }
            }
            public void Push(T data)
            {
                _lst.InsertAtFirst(data);
            }
            public void Pop()
            {
                if (_lst.Length == 0)
                    throw new Exception("栈为空");
                _lst.Remove(0);
            }
            public bool IsEmpty()
            {
                return _lst.IsEmpty();
            }
            public void Clear()
            {
                _lst.Clear();
            }
        }
    }
      

  5.   

    linkstack是我自己写的链栈
      

  6.   

    IStack 呢?SLinkList 呢?
    代码不全如何帮你测试?
    要是我帮你写,怎没能知道你的问题在哪里呢?
      

  7.   

    C# 有现成的 Stack<T> 为何不用呢?
            static void Main(string[] args)
            {
                int[] train = new int[] { 5, 8, 1, 7, 4, 2, 9, 6, 3 };
                //定义三个缓冲轨
                Stack<int>[] H = new Stack<int>[3];
                H[0] = new Stack<int>();
                H[1] = new Stack<int>();
                H[2] = new Stack<int>();
            
                int num = 1;      //当前要进入铁轨的车厢号
                int minT = 10;    //缓冲轨中编号最小的车厢
                int staynum = 0;  //minT车厢对应的缓冲轨
                for (int j = 8; j >= 0; j--)
                {
                    if (minT != num)  
                    {
                        if (train[j] == num)  //将车厢移入铁轨
                        {
                            Console.WriteLine("将车厢{0}移入铁轨", train[j]);
                            num++;
                        }
                        else  //将车厢移入缓冲轨
                        {
                            Hold(train[j], ref minT, ref staynum, ref H, 3, 9);
                        }
                    }
                    else  //将车厢从缓冲轨移入铁轨
                    {
                        Output(ref minT, ref staynum, ref H, 3, 9);
                    }            }
            }        //将车厢放入缓冲轨并且修改minT和staynum值
            public static void Hold(int c, ref int minT, ref int staynum, ref Stack<int>[] H, int k, int n)
            {
                int x;   //车厢索引 
                int Besttrain = n + 1;  //用来寻找最优缓冲轨 
                int num = 0;
                for (int i = 0; i < k; i++)
                {
                    if (H[i].Count > 0) //缓冲轨不为空
                    {
                        x = H[i].Peek();  //栈顶元素
                        if (c < x && x <= minT)
                        {
                            Besttrain = i;
                            staynum = Besttrain;
                            minT = x;
                            num = 1;
                        }
                    }
                    else
                    {
                        Besttrain = i;
                        num = 1;
                        break;
                    }
                }
                if (num == 0)
                {
                    Console.WriteLine("无可用缓冲轨,需添加缓冲轨");
                }
                else
                {
                    H[Besttrain].Push(c);
                    Console.WriteLine("将车厢{0}移入缓冲轨{1}", c, Besttrain + 1);
                }
            }
            //将车厢从缓冲轨移入铁轨并修改minT和staynum值
            public static void Output(ref int minT, ref int staynum, ref Stack<int>[] H, int k, int n)
            {
                //for(int i=1;i<=k;i++)
                Console.WriteLine("将缓冲轨{0}顶部车厢{1}移入铁轨", staynum, minT);
                H[staynum].Pop();
                minT =H[0].Peek() ;
                staynum = 0;
                for (int i = 0; i < k-1; i++)
                {
                    if (minT > H[i + 1].Peek())
                    {
                        minT = H[i + 1].Peek();
                        staynum = i + 1;
                    }
                }
            }
            
        }当然你套用 C++ 代码自己定义一个 LinkStack 也是可以的,但一定要严格测试,确保没有问题才行我不敢说你的 LinkStack 就一定有问题
    但是将
    for (int j = 8; j >= 0; j--)
    写成
    for (int j = 8; j <= 0; j--)
    这样的逻辑错误都发现不了的话,你的那个 LinkStack 谁还敢用?