66.颠倒栈。
题目:用递归颠倒一个栈。例如输入栈{1, 2, 3, 4, 5},1 在栈顶。
颠倒之后的栈为{5, 4, 3, 2, 1},5 处在栈顶。
思路: 首先想到的是再创建一个新栈,用来接收旧栈的数据,但这样空间复杂度是o(n),可不可以用原有的栈完成颠倒的操作呢?
假设栈里只有两个元素1,2,pop出1后,栈里剩下2,我们所做的是把2再弹出,将1push回栈,再push2,
比较重要的是往回push的过程,如果判断栈里还有剩余元素,则需要把剩余元素先都pop出栈,再push元素入栈,这一过程也可以通过递归方式解决
第一个递归方法: void reverse(Stack s) => 先判断当前栈里元素的个数,如果只有一个,则返回即可,否则弹出一个元素,用临时变量保存,然后对剩余所有元素递归调用reverse方法,最后把临时变量保存的第一个弹出来的元素push回栈,这样栈内元素必然是原来的反转
第二个递归方法:void push(Stack s, Object o) => 当需要push一个元素入栈时,我们必须保证这个栈时空的,如果为空则直接push操作,否则弹出一个元素,用临时变量保存,然后对需要push入栈的元素递归调用push方法,然后再把刚才临时变量保存的元素push回去
1 package com.rui.microsoft; 2 3 import java.util.Stack; 4 5 public class Test66_ReverseStackRec { 6 7 public static void main(String[] args) { 8 Test66_ReverseStackRec app = new Test66_ReverseStackRec(); 9 10 Stack old = new Stack(); 11 old.push(3); 12 old.push(2); 13 old.push(1); 14 app.reverse(old); 15 16 while(!old.isEmpty()){ 17 System.out.print(" " + old.pop()); 18 } 19 } 20 21 void reverse(Stack s){ 22 if(s.size() == 1) return; 23 Object top = s.pop(); 24 reverse(s); 25 push(s,top); 26 } 27 28 void push(Stack s, Object o){ 29 if(s.isEmpty()){ 30 s.push(o); 31 return; 32 } 33 Object o2 = s.pop(); 34 push(s, o); 35 s.push(o2); 36 } 37 }