`

java-66-用递归颠倒一个栈。例如输入栈{1,2,3,4,5},1在栈顶。颠倒之后的栈为{5,4,3,2,1},5处在栈顶

 
阅读更多
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();
	}
}

0
0
分享到:
评论
4 楼 bylijinnan 2012-10-13  
neyshule 写道
这样做貌似还不如直接把栈倒到一个queue或是list里面再往回填。。空间复杂度都是n啊,这个算法每次都要开辟一个integer,而且递归还更废不是吗?


从效率上来说的确是那样的

但这道题目是考察递归吧 题目明确规定是 用递归颠倒一个栈
3 楼 neyshule 2012-10-13  
neyshule 写道
Integer top=stack.pop(); 
addToBottom(stack,ele);//important 
stack.push(top);
代码都不对吧,你想一下别扭吗? 

不好意思是对的,看错了。。
2 楼 neyshule 2012-10-13  
Integer top=stack.pop(); 
addToBottom(stack,ele);//important 
stack.push(top);
代码都不对吧,你想一下别扭吗? 
1 楼 neyshule 2012-10-13  
这样做貌似还不如直接把栈倒到一个queue或是list里面再往回填。。空间复杂度都是n啊,这个算法每次都要开辟一个integer,而且递归还更废不是吗?

相关推荐

    java代码-使用Java递归求和1+2+3+...+n的源代码

    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递归实现 阶乘

    在Java中,我们可以创建一个名为`factorial`的方法,该方法接受一个整数n作为参数,然后通过递归调用来计算阶乘。以下是具体实现: ```java public class Factorial { public static void main(String[] args) { ...

    链式栈实现递归和非递归迷宫路径求解

    在Java中,可以定义一个递归函数,传入当前节点和之前路径的信息,通过不断调用自身寻找所有可能的路径。 "pers.hr.homework.maze"可能是包含迷宫求解算法实现的Java源代码文件。在这个文件中,我们可能会看到类的...

    java编写的递归与非递归

    在Java中编写递归函数时,需要注意两个关键点:**基本情况**(base case)和**递归情况**(recursive case)。 - **基本情况**:这是递归结束的条件。对于阶乘来说,基本情况通常是`n == 0`时返回`1`。 - **递归...

    java实现的二叉树的递归和非递归遍历

    在Java编程语言中,二叉树是一种非常重要的数据结构,它由节点构成,每个节点包含一个值,并且可能有两个子节点:左子节点和右子节点。二叉树的遍历是访问每个节点的过程,通常分为三种主要方式:前序遍历、中序遍历...

    java培训知识-递归

    然而,在实际开发中,应谨慎使用递归,考虑其性能影响,并尽量优化,例如通过记忆化技术减少重复计算,或者用循环代替递归以提高效率。在Java培训中,深入理解和熟练运用递归是提升编程能力的重要一步。

    可以节省(n-1)!次递归的排列生成工具类(java)

    例如,可以使用栈或其他数据结构来模拟递归的过程。 ### 7. **复杂度分析** - **时间复杂度**:对于给定的方法,其时间复杂度主要取决于递归调用的次数。通过减少递归调用,整体的时间复杂度得到了优化。 - **空间...

    栈递归.rar

    解决这个问题通常使用递归算法,其中栈被用来保存中间状态,使得每次只处理一个盘子的移动。 在"栈递归"这个主题中,理解栈如何支持递归至关重要。当函数调用自身时,系统会在栈中为每个新函数调用分配一块区域来...

    栈和递归遍历实例

    栈的方法通常涉及手动维护一个待处理目录列表,每次从栈顶取出一个目录,检查其内容,将其子目录压入栈中,然后继续处理下一个项目。这种方法强调控制流的顺序,适合于深度优先搜索(DFS)。 递归方法则是通过定义...

    【IT十八掌徐培成】Java基础第03天-02.函数定义-调用-sum-fac-递归.zip

    例如,`factorial(5)`会计算`5 * factorial(4)`,`factorial(4)`又会计算`4 * factorial(3)`,依此类推,直至到达`factorial(1)`。 通过观看“Java基础第03天-02.函数定义-调用-sum-fac-递归.avi”这个视频教程,...

    数据结构两栈共享空间C++顺序栈

    两栈共享空间的解决方案是设计一个数据结构,使得两个栈可以在同一块内存区域交替使用,当一个栈为空时,另一个栈可以占用全部空间。这种设计提高了内存利用率,特别是在嵌入式系统或资源受限的环境中显得尤为重要。...

    递归程序用栈改写为非递归

    C语言,将一个递归程序用栈改写为非递归,其中用到栈的基本操作

    【Java】求1-100范围内的素数递归方法

    【Java】求1-100范围内的素数递归方法代码例子。分享,感谢。

    java 栈的实现和应用

    1. **ArrayDeque类**:Java集合框架提供了一个双端队列`ArrayDeque`,它可以被用作一个高效的栈。`ArrayDeque`继承自`AbstractCollection`,并实现了`Deque`接口,这个接口包含了栈的所有操作。创建一个栈并进行操作...

    数据结构与算法(JAVA篇)之递归算法

    - **使用栈**:可以手动维护一个栈来模拟递归调用的过程,从而避免真正的函数调用带来的开销。 - **循环替代**:对于一些简单的递归情况,可以通过循环结构替换递归调用来实现相同的功能。 #### 递归与栈的关系 ...

    栈与递归--含分治与回溯.ppt

    递归的另一个经典应用是斐波那契数列(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-&gt;eBaA (2)A-&gt;a|bAcB (3)B-&gt;dEd|aC ...(2)输入一以#结束的符号串:在此位置输入符号串例如:eadeaa# (3)输出结果:eadeaa#为合法符号串

Global site tag (gtag.js) - Google Analytics