zoukankan      html  css  js  c++  java
  • 微软算法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 }
  • 相关阅读:
    大二实习使用的技术汇总(下)
    【JSP】JSTL使用core标签总结(不断更新中)
    凸包---HDU 2202
    poj
    [MFC]MFC中OnDraw与OnPaint的区别
    PHP 自动生成导航网址的最佳方法 v20130826
    汉语-词语-调料:百科
    汉语-词语-味觉:百科
    汉语-词语-本源:百科
    un-人物-企业家-迈纳·基思:百科
  • 原文地址:https://www.cnblogs.com/aalex/p/5021704.html
Copyright © 2011-2022 走看看