栈--原地reverse栈
Posted swifthao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈--原地reverse栈相关的知识,希望对你有一定的参考价值。
思路
不用其他数据结构,用递归实现原地逆置
需要设计两个递归函数:
- 递归函数1:将栈底元素返回并且移除
- 递归函数2:使用到函数1的reverse方法
代码
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掉
以上是关于栈--原地reverse栈的主要内容,如果未能解决你的问题,请参考以下文章
leetcode栈--1evaluate-reverse-polish-notation(逆波兰表达式)
全栈编程系列SpringBoot整合Shiro(含KickoutSessionControlFilter并发在线人数控制以及不生效问题配置启动异常No SecurityManager...)(代码片段