微软算法100题66 颠倒栈

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 }

 

posted @ 2015-12-05 15:53  蟹粉小笼包  阅读(368)  评论(0编辑  收藏  举报