算法练习 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);
}
}