用递归函数和栈操作逆序栈
用递归函数和栈操作逆序栈
作者:Grey
原文地址:
题目描述
请设计一个算法实现逆序栈的操作,但是只能用递归函数来实现,而不能用另外的数据结构。给定一个栈Stack以及栈的大小top,请返回逆序后的栈。
题目链接:牛客-用递归函数和栈操作逆序栈
首先,如果我们可以用递归函数实现这样的功能:获取一个栈的栈底元素并返回栈底元素,然后把栈底元素删除,并把剩余元素压下来,假设方法为int getBottom(stack, top)
示例图如下
假设原始栈如下
调用int getBottom(stack, top)
获取栈底元素 h 并返回栈底元素,然后把栈底元素删除,并把剩余元素压下来,栈变成如下样子
然后递归调用原函数,将剩余部分逆序
最后将之前的栈底元素放到原来的栈顶
即完成了栈的逆序
整个算法我们可以通过如下方式来实现
// 逆序一个栈
public int[] reverseStackRecursively(int[] stack, int top) {
if (top >= 1) {
// 获取栈底元素
int bottom = getBottom(stack, top);
// 逆序除了栈底的剩余部分
stack = reverseStackRecursively(stack, --top);
// 栈底放栈顶
stack[top] = bottom;
}
return stack;
}
接下来就是int getBottom(stack, top)
的实现,由于此方法要实现的功能是
-
返回栈底元素
-
删掉栈底元素
-
其余元素压下来
且该函数也需要通过递归来实现,base case 是top == 1
的时候,栈只有一个元素
直接返回stack[0]
,
接下来是普遍情况,通过
int tmp = stack[--top];
获取栈顶元素
然后
int bottom = getBottom(stack, top);
获取栈底元素,bottom 即为要返回的元素
最后
stack[--top] = tmp;
栈顶元素下降一格,表示压下来这个动作。
完整代码如下
import java.util.*;
public class ReverseStack {
public int[] reverseStackRecursively(int[] stack, int top) {
if (top >= 1) {
// 获取栈底元素
int bottom = getBottom(stack, top);
// 逆序
stack = reverseStackRecursively(stack, --top);
// 栈底放栈顶
stack[top] = bottom;
}
return stack;
}
public int getBottom(int[] stack, int top) {
if (top == 1) {
return stack[0];
} else {
int tmp = stack[--top];
int bottom = getBottom(stack, top);
stack[--top] = tmp;
return bottom;
}
}
}
更多#
作者:GreyZeng
出处:https://www.cnblogs.com/greyzeng/p/16746395.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
你可以在这里自定义其他内容
本文来自博客园,作者:Grey Zeng,转载请注明原文链接:https://www.cnblogs.com/greyzeng/p/16746395.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~