如何仅用递归函数和栈操作逆序一个栈——你要先用stack实现,再去改成递归——需要对递归理解很深刻才能写出来
/**
* 如何仅用递归函数和栈操作逆序一个栈
* 题目:
* 一个栈依次压入1,2,3,4,5,那么从栈顶到栈底分别为5,4,3,2,1。
* 将这个栈转置后,从栈顶到栈底为1,2,3,4,5,也就是实现栈中元素的逆序,
* 但是只能用递归函数来实现,不能用其他数据结构。
*
*/
方法一:
既然是递归,第一反应是采用两个栈实现该功能实现,依次弹出栈顶元素,然后压入另外一个栈中,代码如下:
import java.util.Stack;
public class StackReverse0 {
private Stack<Integer> stack0;
private Stack<Integer> stack1;
public StackReverse0(){
stack0 = new Stack<Integer>();
stack1 = new Stack<Integer>();
}
public void getLastElement(){
Integer pop = stack0.pop();
stack1.push(pop);
if(!stack0.isEmpty())
getLastElement();
}
public static void main(String[] args) {
StackReverse0 sr = new StackReverse0();
sr.stack0.add(1);
sr.stack0.add(2);
sr.stack0.add(3);
sr.stack0.add(4);
sr.stack0.add(5);
sr.getLastElement();
System.out.println(sr.stack1.pop());
System.out.println(sr.stack1.pop());
System.out.println(sr.stack1.pop());
System.out.println(sr.stack1.pop());
System.out.println(sr.stack1.pop());
}
}
方法2:类似两个stack的思路,不过是使用一个stack搞定。
import java.util.Stack;
public class StackReverse {
public static int getAndRemoveLastElement(Stack<Integer> stack){ //负责删除stack bottom的一个元素,并返回
int result = stack.pop();
if(stack.isEmpty()){
return result;
}else{
int last = getAndRemoveLastElement(stack);
stack.push(result); // stack还原
return last;
}
}
public static void reverse(Stack<Integer> stack){
if(stack.isEmpty()){
return;
}
int i = getAndRemoveLastElement(stack);
reverse(stack);
stack.push(i); // 效果就是依次将stack top的元素入栈,最后效果就是stack元素逆序
}
public static void main(String[] args) {
Stack<Integer> stack = new Stack<Integer>();
stack.push(1);
stack.push(2);
stack.push(3);
stack.push(4);
stack.push(5);
reverse(stack);
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.pop());
}
}
如何仅用递归函数和栈操作逆序一个栈——你要先用stack实现,再去改成递归——需要对递归理解很深刻才能写出来的更多相关文章
- 常见面试算法题JS实现-仅用递归函数和栈操作逆序一个栈
前言: 因为JAVA和JS语言特性的不同,有些东西在JAVA中可能需要一些技巧和手段才能实现的复杂程序,但是在JS中可能就是天然存在的,所以这套书里面的题目不会全部用JS去实现一遍,因为可能JS的实现 ...
- 仅用递归函数操作逆序一个栈(Swift 4)
/// 取出栈底的数 func getAndRemoveLastElement(_ items: inout [Int]) -> Int { let value = items.remove(a ...
- 算法笔记(c++)-使用递归函数逆序一个栈
---恢复内容开始--- 使用递归函数逆序一个栈 题目:使用递归函数,不借助其他数据结构逆序一个栈. 我的思路:使用递归函数保存栈中变量. 递归函数分两个,一个获取并移除栈底元素,另一个负责逆序.其实 ...
- ZOJ-3261 Connections in Galaxy War---离线操作+逆序并查集
题目链接: https://cn.vjudge.net/problem/ZOJ-3261 题目大意: 给你一些点,还有一些边,每个点上都有一个权值,然后有一些询问,分为两种,query a 询问与a直 ...
- c语言实战 逆序一个三位数
题目:给定一个正的三位整数,比如123,输出321,但如果是700,输出必须是7不能是007 思路是怎么样的呢? 假设这个正三位数是m,它的百分位是c,十分位是b,个位是a,那么就存在下面的等式. m ...
- 逆序一个8bit的2进制数
- php实现栈操作(不用push pop 库函数)
直接上代码 <?php /*php不用库函数实现栈操作 * @author Geyaru 2019-04-20 */ class stack{ private $top = -1; //栈指针初 ...
- Android_Fragment栈操作 commit()问题分析
栈操作时遇到一个问题 getFragmentManager().beginTransaction() .replace(R.id.fl_container,bFragment) .addToBackS ...
- 5, java数据结构和算法: 栈 , 入栈, 出栈, 正序遍历,,逆序遍历
直接上代码: class ArrayStack{ //用数组模拟栈 int maxSize; int[] stack; int top = -1;//表示栈顶 public ArrayStack(in ...
随机推荐
- Python 爬虫常用的库
一.常用库 1.requests 做请求的时候用到. requests.get("url") 2.selenium 自动化会用到. 3.lxml 4.beautifulsoup 5 ...
- react-redux的mapStateToProps可取到state值但不会注入props
一.问题描述 想通过react-redux和redux实现react组件之间的通信,reducer.action.store都编写正确,mapDispatchToProps也能正确传值.唯独mapSt ...
- _spellmod_aura_trigger
一.spell.dbc做一个空光环 二.配置_spellmod_aura_trigger表 comment 备注 aura 光环ID,有此光环时,才会触发下面技能 linkSpell1-3 链接的技能 ...
- 51nod 1185 || 51nod 1072 威佐夫博弈
贴个模板:平常的跟高精度java的: int: #pragma comment(linker, "/STACK:1024000000,1024000000") #include&l ...
- SPOJ QTREE Query on a tree 树链剖分+线段树
题目链接:http://www.spoj.com/problems/QTREE/en/ QTREE - Query on a tree #tree You are given a tree (an a ...
- module.exports小程序模块化,require
小程序模块化 可以将一些公共的代码抽离成为一个单独的 js 文件,作为一个模块.模块只有通过 module.exports 或者 exports 才能对外暴露接口. tips:exports 是 mo ...
- 浅谈 Java JPDA
前言 程序员在坊间有非常多有趣的故事,其中就有这么一则:”这个在我的电脑上是好的,没问题的呀,诺,你看咯,一定是你打开姿势不正确,浏览器版本不正确,操作系统不统一等,总之不是我代码问题(傲娇)”.看到 ...
- 学习笔记24—win10环境下python版libsvm的安装
1.前言 由于毕业设计需要用到libsvm,所以最近专心于配置libsvm,曾经尝试过在matlab中安装,但是没有成功.最终在Python环境中完成安装. 2.LIBSVM介绍 LIBSVM 是台湾 ...
- JS中的弹窗问题confirm和prompt
JavaScript-确认(confirm 消息对话框) confirm 消息对话框通常用于允许用户做选择的动作,如:“你对吗?”等.弹出对话框(包括一个确定按钮和一个取消按钮). 语法: confi ...
- U8工具栏特别小是怎么回事
用友的工具栏特别窄了,填制凭证里的保存.增加凭证等按钮因为工具栏特别窄都看不清了 解决方法:正常机器下的system32下面的mscomctl.ocx文件替换到有问题的机器下,您的系统应该是XP的,这 ...