前言--
博主本打算把2,3题合并在一同一篇博文,但是第二题的题解写的有点长,如果合并在一起反而不利于阅读,so,另外写一篇文章来记录了(PS:我现在困得用音乐来提神了,回宿舍还有计算机组成,嵌入式应用的报告要写,还要口语的打卡,然后洗澡,洗衣服,想想就累 啊!!!,不过还是得好好坚持!)
如何仅用递归函数和栈操作逆序一个栈
题目:一个栈依次压入1.2.3.4.5,那么从栈顶的到栈底的元素就分别是5.4.3.2.1,如何通过递归函数把这个栈的元素逆序,使栈
顶到栈底的元素依次是1.2.3.4.5.
分析:这题我想了半小时,没想出来,然后看了下题解,感觉真的太妙了,一个getAndRemoveLast()的递归函数,作用是用来去除栈底的元素并返回栈底的元素。这个方法我真的想不出来,实在是太妙了,ORZ,不过这个姿势我记下了,以后多用使之转变为自己的。
附getAndRemoveLast()代码:
public int getAndRemoveLast( Stack<Integer> stack ) {
int value = stack.pop();
int result;
if(stack.empty()) {
return value;
}
else {
result = getAndRemoveLast(stack);
stack.push(value);
return result;
}
}
由于递归的理解完全取决于个人,我只能按我自己的理解给大家解释一下,首先这个函数的作用就是对于当前的栈,我把栈顶的
元素给pop了,如果pop完之后栈为空了,说明当前pop出去的元素就是栈底的元素了,那么就可以return 了。
如果pop完之后,剩余的栈还不为空,那么我们还需要对剩余的栈进行getAndRemoveLast。当返回该层次调用的时候,说明已经把剩余的栈的栈底元素给去除了并且返回了它的值,那么我此时应该把在这个层次Pop出去的数,给Push回去。
这样当我们返回第一层调用时,就已经把栈底的元素给去除了,而其他元素不变,是不是很妙!!!!!!
除了getAndRemoveLast()这个递归函数之外,我们还要设计一个Rverse()函数。
我在理解了第一个递归函数后,不用看书就能自己实现出第二个递归函数Reverse(),写完之后跟书对照了之后,发现都一样的,看来getAndRemoveLast()这个递归函数的设计才是难点!
附Reverse的代码:
public void Reverse(Stack<Integer>stack) {
int value = this.getAndRemoveLast(stack);
if(stack.empty()){
stack.push(value);
return;
}
else {
this.Reverse(stack);
stack.push(value);
}
}
分析Reverse():
其实很简单,我们要怎么对一个栈完成逆序呢?
首先,把这个栈的栈底元素去除并且先保留它的值,然后对剩余的栈实现Reverse(), 剩余部分Reverse()完成,意味着剩余的部分已经翻转,然后我们再push原先保留的栈底的元素,这样是不是就成功翻转了呢! 我这句话实际上就是描述了Reverse()的函数该如何设计,由于递归函数的理解完全取决于个人,请读者自行好好理解,必定大于好处!
Ps:滚回宿舍继续干活了~~~~~,顺便附上JAVA完整代码:
package code_180;
import java.util.*;
import java.util.Stack;
public class ReverseStack {
private Stack<Integer> stack;
ReverseStack(){
this.stack = new Stack<Integer>();
}
public int getAndRemoveLast( Stack<Integer> stack ) {
int value = stack.pop();
int result;
if(stack.empty()) {
return value;
}
else {
result = getAndRemoveLast(stack);
stack.push(value);
return result;
}
}
public void Reverse(Stack<Integer>stack) {
int value = this.getAndRemoveLast(stack);
if(stack.empty()){
stack.push(value);
return;
}
else {
this.Reverse(stack);
stack.push(value);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int []arrayTest = {1,2,3,4,5};
ReverseStack myStack = new ReverseStack();
for(int i = 0 ;i < 5 ;i++)
myStack.stack.push(arrayTest[i]);
myStack.Reverse(myStack.stack);
while( !myStack.stack.empty()) {
System.out.println(myStack.stack.peek());
myStack.stack.pop();
}
}
}