如何仅用递归函数和栈操作逆序一个栈

题目

一个栈依次压入1、2、3、4、5,那么从栈顶到栈底分别为5、4、3、2、1。将这个栈转置后,从栈顶到栈底为1、2、3、4、5,也就是实现栈中元素的逆序,但是只能用递归函数来实现,不能用其他数据结构。

实现思路

1.实现递归函数getAndRemoveLastElement,获取到栈底元素返回并移除
2.再实现一个递归函数reverse,逆序一个栈,将获取的栈底元素压入到栈中

代码实现

//获取到栈底元素返回并移除
function getAndRemoveLastElement(stack){
   let result = stack.pop()
   if(stack.length == 0){
       return result
   }else{
       let last = getAndRemoveLastElement(stack)
       stack.push(result)
       return last
   }
}
//调用getAndRemoveLastElement,将获取的栈底元素压入到栈中
function reverse(stack){
   if(stack.length == 0){
       return;
   }
   let i = getAndRemoveLastElement(stack);
   reverse(stack)
   stack.push(i)
}

简单对数器实现

//对数器实现,为了验证算法过程的疏漏;适用于改变输入值本身,不返回新的数组
function getResult(stack,funName){
    funName(stack)
    return stack
}
//num:生成测试用例的数目 compareOne:自己实现算法的函数名称 compareTwo:其他成功的实现算法函数名称
function Logarithm(num,compareOne,compareTwo){
    //实现随机数列,生成测试用例
    let arr = []
    for(let i = 0;i<num;i++){
        let numItem = parseInt(i *Math.random()*10)
        arr.push(numItem)
    }
    let arr2 = getResult(arr,compareTwo);
    let arr1 = getResult(arr,compareOne)
    let falseArr = []
    let k = 0
    let j = 0
    for(let i = 0,j=0,k=0;i<arr1.length;i++){
        if(arr1[i]==arr2[i]){
            j++
            process.stdout.write('√')
        }else{
            k++
            process.stdout.write('❌',k)
            falseArr.push(arr1[i])
        }
    }
    console.log(`结束`)
    console.log('------------------------------------------------')
    console.log(`本次测试用例是`)
    console.log(`${arr}`)
    console.log(`测试1函数的实验结果是`)
    console.log(`${arr1}`)
    console.log(`测试2函数的实验结果是`)
    console.log(`${arr2}`)
    console.log(`本次测试共测试${num}组,发生错误${k}组。`)
    }
    module.exports = {Logarithm};

简单测试

var {Logarithm} = require('./Logarithm')
function arrayReve(stack){
stack.reverse()
}
//测试
// let stack = [5,4,3,2,1];
// reverse(stack)
// console.log(stack);

Logarithm(100,reverse,arrayReve)

代码下载地址

感谢

如果感觉对您的学习工作有帮助,请将它分享给需要的人,或者点赞鼓励一下,感谢支持
你可以加个收藏,我还会不断更新。。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值