题目
用递归颠倒一个栈,例如输入栈[1,2,3,4,5],1在栈顶,颠倒之后的栈为[5,4,3,2,1],5在栈顶。
解法
1. 一种比较简单的做法是,使用一个辅助数组,将原始栈中的元素依次出栈,顺序存储到数组中,然后遍历数组中的元素进行入栈,这样就完成了栈的颠倒。但这样需要一个辅助的数组,且没有使用递归的特性。
2. 使用递归。将原始栈的颠倒分为两个步骤:(1)栈顶元素放到栈底,(2)然后反转剩余的元素,即可完成栈的反转。如何实现这两个步骤?
先看第二个步骤,它是对除栈顶元素之外的栈进行颠倒,与对原始栈的颠倒步骤一样,是递归。再看第(1)个步骤,当需要将栈顶元素放置到栈底时,如果栈为空则直接放置,如果栈中有其他元素,则其他元素出栈后,放置栈顶元素,然后在将出栈的元素按照相反的顺序放置到栈中。这样看来这个步骤中应该需要一个辅助的栈,但这里可以使用递归中默认维护的一个递归栈进行。
REVERSE-STACK(Stack stack):
if stack.size == 1:
return stack;
int top_num = stack.pop(); // 栈顶元素出栈
REVERSE-STACK(stack); // 颠倒剩余的栈
PUT-TO-BOTTOM(stack, top_num ); // 栈顶元素放置到栈底
PUT-TO-BOTTOM(Stack stack, int top_num):
if stack.isEmpty(): // 如果栈为空,直接放置到栈底
stack.push(top_num);
return;
int other = stack.pop(); // 其他元素出栈
PUT-TO-BUTTOM(stack, top_num); // 栈顶元素放置到栈底
stack.push(other); // 其他元素返回栈中