题目一:栈的压入和弹出顺序
- 题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的数字均不相等。例如序列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; }
时间: 2024-11-25 12:41:36