标签:code ast str 方法 integer for 条件 流程分析 ack
不用其他数据结构,用递归实现原地逆置
需要设计两个递归函数:
class StackReverse {
public int getAndRemoveLastElement(Stack<Integer> stack){
int top = stack.pop();//注意这里是pop,不是peek
if (stack.empty()){
return top;
}else {
int result = getAndRemoveLastElement(stack);
stack.push(top);
return result;
}
}
public void reverse(Stack<Integer> stack){
if (stack.empty()){
return;
}else {
int ans = getAndRemoveLastElement(stack);
reverse(stack);
stack.push(ans);
}
}
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
stack.push(3);
stack.push(2);
stack.push(1);
// for (Integer i:stack) {
// System.out.println(i);
// }
StackReverse solution = new StackReverse();
solution.reverse(stack);
while (!stack.empty()){
System.out.println(stack.pop());//结果为3,2,1;说明已经成功reverse栈
}
}
}
getAndRemoveLastElement函数执行流程
首先从栈顶到栈尾,元素分别是1,2,3.对于getAndRemoveLastElement函数(以下简称get)。第一次调用get函数时,top=1,并且将1出栈,栈内元素为2,3 。接着第二次调用get 函数,top=2,将2出栈,栈内元素为3 。接着第三次调用get函数,top=3,将3出栈,栈内元素为空,此时满足if判断(递归终止条件),第三次get函数return 3,跳出第三次调用的get函数。回到第二次调用的get函数,result等于第三次get函数return的值3,此时top=2,将2压入栈,return result(3)。此时第二次get函数结束,跳到了第一次get函数,此时top=1,result等于第二次get函数return的值3,将top=1压入栈,return result(3),至此,所有的get函数全部跳出,“pop”出了栈底元素3,其他元素“不变”
reverse函数执行流程
第一次调用reverse函数,ans=栈底元素3,并且将3出栈,进入第二次调用的reverse函数。第二次调用的reverse函数,ans=2,并且将2出栈,进入第三次调用的reverse函数。第三次调用的reverse函数,ans=1,并且将1出栈,进入到第四次reverse函数。第四次reverse函数,stack为空,return;(递归终止条件),跳出第四次reverse,进入到第三次reverse,此时ans=1,将1push到栈中,跳出第三次reverse ... 最后栈内元素成功reverse掉
标签:code ast str 方法 integer for 条件 流程分析 ack
原文地址:https://www.cnblogs.com/swifthao/p/12776362.html