码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构(栈和队列)

时间:2015-09-06 14:32:52      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:

题目一:栈的压入和弹出顺序

  • 题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的数字均不相等。例如序列1,2,3,4,5是某栈的压栈序列,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。

 

  • 思路:用两个数组来表示两个序列,用两个index来指向各自数组当前的引用,用一个栈来记录压栈的过程,stack 压入数字1, 比较1与另一个序列当前的值即4,发现不等,继续压栈,直到原始序列中4被压入,此时弹出4,另一个序列的index向后移动一位,再继续比较,直到第一个序列指针指向最后一位,而stack也空了,则该序列是压栈序列的弹出序列,如果指针指向了最后一个数字,但是stack里任然有值,则不是。
        static bool IsPopOrder(int[] order, int[] popOrder)
            {
                Stack<int> stack = new Stack<int>();
                int currentOrderIndex = 0;     // 原始序列当前指针
                int currentPopOrderIndex = 0;  //待检验序列当前指针
    
                if (order == null || popOrder == null || order.Length != popOrder.Length || order.Length == 0)
                {
                    return false; //鲁棒性考虑
                }
                if (order.Length == 1 && order[0] == popOrder[0])
                {
                    return true;//如果各自序列都只有一个值,而且相等,则OK
                }
                stack.Push(order[currentOrderIndex]); //将原始序列第一个值压栈
                currentOrderIndex++; //指针指向后一位。
                while (currentOrderIndex <= order.Length) //原始序列的当前指针没有指向最后则一直循环  
    //加等号是为了让循环继续,因为最后被加入stack里的值,还没有机会pop出来
    { while (stack.Count > 0 && stack.Peek() == popOrder[currentPopOrderIndex])//如果栈顶的数字和待检验的序列当前数字相等 { stack.Pop();//弹出 currentPopOrderIndex++;//待检验序列当前指针向后移。 } //如果不相等,则 if (currentOrderIndex < order.Length) { stack.Push(order[currentOrderIndex]);//原始序列压栈 } currentOrderIndex++; //原始序列指针向后移动 } if (stack.Count == 0) { return true; } return false; }

     

数据结构(栈和队列)

标签:

原文地址:http://www.cnblogs.com/leonhart/p/4785177.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!