边看边写(判断一个序列是否为出栈序列)

来源:互联网 发布:仓廪实而知礼节 编辑:程序博客网 时间:2024/06/05 21:25
#region 栈操作    /// <summary>    /// ISPopOrder()判断一个序列是否为出栈序列    /// </summary>    /// <typeparam name="T"></typeparam>    class MyStack<T> where T : IComparable<T>    {        private Stack<T> _stack;        public Stack<T> stack        {            get { return _stack; }            set { _stack = value; }        }        public MyStack(List<T> list)        {            if (stack == null)                stack = new Stack<T>();            foreach (T item in list)            {                stack.Push(item);            }        }        public MyStack()        {            if (stack == null)                stack = new Stack<T>();        }        public void Push(T item)        {            stack.Push(item);        }        public T Pop()        {            if (stack.Count > 0)                return stack.Pop();            return default(T);        }        public bool ISPopOrder(List<T> pop)        {            bool bPossible = false;            List<T> push = new List<T>();            while (stack.Count > 0)                push.Add(stack.Pop());            push.Reverse();            push.ForEach(q => stack.Push(q));            if (push.Count != 0 && pop.Count != 0)            {                Stack<T> stackData = new Stack<T>();                while (pop.Count > 0)                {                    while (stackData.Count == 0 || stackData.Peek().CompareTo(pop.First()) != 0)                    {                        if (push.Count == 0) break;                        stackData.Push(push.First());                        push.RemoveAt(0);                    }                    if (stackData.Peek().CompareTo(pop.First()) != 0)                        break;                    stackData.Pop();                    pop.RemoveAt(0);                }                if (stackData.Count == 0 && pop.Count == 0)                    bPossible = true;            }            return bPossible;        }    }    #endregion