import java.util.Stack;
public class ReverseStackRecursive {
/**
* Q 66.颠倒栈。
* 题目:用递归颠倒一个栈。例如输入栈{1,2,3,4,5},1在栈顶。
* 颠倒之后的栈为{5,4,3,2,1},5处在栈顶。
*1. Pop the top element
*2. Reverse the remaining stack
*3. Add the top element to the bottom of the remaining stack
*/
public static void main(String[] args) {
ReverseStackRecursive r=new ReverseStackRecursive();
Stack<Integer> stack=new Stack<Integer>();
for(int i=0;i<10;i++){
stack.add(i);
}
r.printStack(stack);
r.reverseStack(stack);
r.printStack(stack);
}
public void reverseStack(Stack<Integer> stack){
if(!stack.empty()){
Integer top=stack.pop();
reverseStack(stack);
addToBottom(stack,top);
}
}
public void addToBottom(Stack<Integer> stack,Integer ele){
if(stack.empty()){
stack.push(ele);
}else{
Integer top=stack.pop();
addToBottom(stack,ele);//important
stack.push(top);
}
}
public void printStack(Stack<Integer> stack){
/*
while(!stack.empty()){
System.out.print(stack.pop()+",");
}
*/
//we don't remove the elements in the stack.
for(Integer x:stack){
System.out.print(x+",");
}
System.out.println();
}
}
分享到:
相关推荐
java代码-使用Java递归求和1+2+3+...+n的源代码 ——学习参考资料:仅用于个人学习使用!
例如,阶乘是一个常见的递归函数应用场景,n的阶乘定义为n! = n * (n-1)!。在递归实现中,阶乘函数会像这样定义: ```python def recursive_factorial(n): if n == 0 or n == 1: return 1 else: return n * ...
在Java中,我们可以创建一个名为`factorial`的方法,该方法接受一个整数n作为参数,然后通过递归调用来计算阶乘。以下是具体实现: ```java public class Factorial { public static void main(String[] args) { ...
在Java中,可以定义一个递归函数,传入当前节点和之前路径的信息,通过不断调用自身寻找所有可能的路径。 "pers.hr.homework.maze"可能是包含迷宫求解算法实现的Java源代码文件。在这个文件中,我们可能会看到类的...
在Java中编写递归函数时,需要注意两个关键点:**基本情况**(base case)和**递归情况**(recursive case)。 - **基本情况**:这是递归结束的条件。对于阶乘来说,基本情况通常是`n == 0`时返回`1`。 - **递归...
在Java编程语言中,二叉树是一种非常重要的数据结构,它由节点构成,每个节点包含一个值,并且可能有两个子节点:左子节点和右子节点。二叉树的遍历是访问每个节点的过程,通常分为三种主要方式:前序遍历、中序遍历...
然而,在实际开发中,应谨慎使用递归,考虑其性能影响,并尽量优化,例如通过记忆化技术减少重复计算,或者用循环代替递归以提高效率。在Java培训中,深入理解和熟练运用递归是提升编程能力的重要一步。
例如,可以使用栈或其他数据结构来模拟递归的过程。 ### 7. **复杂度分析** - **时间复杂度**:对于给定的方法,其时间复杂度主要取决于递归调用的次数。通过减少递归调用,整体的时间复杂度得到了优化。 - **空间...
解决这个问题通常使用递归算法,其中栈被用来保存中间状态,使得每次只处理一个盘子的移动。 在"栈递归"这个主题中,理解栈如何支持递归至关重要。当函数调用自身时,系统会在栈中为每个新函数调用分配一块区域来...
栈的方法通常涉及手动维护一个待处理目录列表,每次从栈顶取出一个目录,检查其内容,将其子目录压入栈中,然后继续处理下一个项目。这种方法强调控制流的顺序,适合于深度优先搜索(DFS)。 递归方法则是通过定义...
例如,`factorial(5)`会计算`5 * factorial(4)`,`factorial(4)`又会计算`4 * factorial(3)`,依此类推,直至到达`factorial(1)`。 通过观看“Java基础第03天-02.函数定义-调用-sum-fac-递归.avi”这个视频教程,...
两栈共享空间的解决方案是设计一个数据结构,使得两个栈可以在同一块内存区域交替使用,当一个栈为空时,另一个栈可以占用全部空间。这种设计提高了内存利用率,特别是在嵌入式系统或资源受限的环境中显得尤为重要。...
C语言,将一个递归程序用栈改写为非递归,其中用到栈的基本操作
【Java】求1-100范围内的素数递归方法代码例子。分享,感谢。
1. **ArrayDeque类**:Java集合框架提供了一个双端队列`ArrayDeque`,它可以被用作一个高效的栈。`ArrayDeque`继承自`AbstractCollection`,并实现了`Deque`接口,这个接口包含了栈的所有操作。创建一个栈并进行操作...
- **使用栈**:可以手动维护一个栈来模拟递归调用的过程,从而避免真正的函数调用带来的开销。 - **循环替代**:对于一些简单的递归情况,可以通过循环结构替换递归调用来实现相同的功能。 #### 递归与栈的关系 ...
递归的另一个经典应用是斐波那契数列(Fibonacci sequence),其定义为:`F(1) = 1, F(2) = 1, F(n) = F(n-1) + F(n-2)`。如下所示的递归函数虽然直观,但效率低下,因为存在大量重复计算: ```cpp int fibonacci...
2. 初始化一个栈,将整个数组的范围(0至数组长度-1)压入栈中。 3. 进行一个循环,直到栈为空。 4. 在循环内,弹出栈顶元素,即当前处理的子数组范围。 5. 对子数组进行划分,选择一个基准值,将数组分为两部分,...
对下列文法,用递归下降分析法对任意输入的符号串进行分析: (1)E->eBaA (2)A->a|bAcB (3)B->dEd|aC ...(2)输入一以#结束的符号串:在此位置输入符号串例如:eadeaa# (3)输出结果:eadeaa#为合法符号串