算法练习 1 —— 反转栈

目前我自己的水平还很菜,所以想通过每天有时间的话就做道算法题,提升一下自己的思维。同时也通过博客记录我的点点滴滴吧。

 

我做的第一道算法题是:反转栈。(比如:原来是1,2,3,4,5,现在要把它反转成5,4,3,2,1)这道题如果可以用一个额外的栈或者list之类的变量做临时存储,那么就特别简单了。所以现在是要求只能用一个基本变量来做临时存储。需要用递归来实现。

 

好久没接触算法,还用到递归,当时百度上看别人的做法,感觉完全看不懂。费了好多脑细胞,独自思考好久,才终于想通。其实你如果想通递归的原理后,就会发现,原来就这么简单(特别声明:我现在觉得我这个方法简单易懂,并且我也用6组不同长度的数据做了测试,没问题;但是如果我的逻辑存在漏洞或是有不对的,还请指出)。

 

以下是我的代码:

public class Reverse {

  public static void reverse3(Stack<Integer> stack){
    if(stack.isEmpty()){
      return;
    }
    else if (stack.size() == 1) {
      return;
    }
    else if (stack.size() == 2) {
      stack.insertElementAt(stack.pop(), 0);
    }else{
      //把最上面的元素弹出来,插入到栈底
      Integer last = stack.pop();
      reverse3(stack); //此处递归调用。思考的时候可以把这一步当作已经排好序的了。
      stack.insertElementAt(last, 0);
    }
  }

 

  public static void main(String[] args) {

    Stack<Integer> stack = new Stack<Integer>();

    stack.push(new Integer(1));
    stack.push(new Integer(2));
    stack.push(new Integer(3));
    stack.push(new Integer(4));
    stack.push(new Integer(5));
    System.out.println("Before reverse3 : " + stack);
    reverse3(stack);
    System.out.println("After reverse3 : " + stack);
  }

}

posted @ 2018-07-13 16:15  LisaJ  阅读(199)  评论(0编辑  收藏  举报