递归——逆序一个栈

/*

仰望好的尝试?
给你一个栈,请你逆序这个栈,
不能申请额外的数据结构
只能使用递归函数。如何实现?
*/


/*
第一步  实现去掉栈底,并返回的函数 int f(stack)


| 1 |  |   |
| 2 |  | 1 |
| 3 |  | 2 |
-----  -----
f  r = 1 , last = f2(stack)
                  f2    r = 2, last = f3(stack)
                                      f3  r = 3  return
 */




type Stack []int

func (s *Stack)IsEmpty() bool {
	return len(*s) == 0
}

func (s *Stack)Pop() int {
	res := (*s)[len(*s)-1]
     *s = (*s)[:len(*s)-1]
	return res
}

func (s *Stack)Push(val int)  {
	*s = append(*s,val)
}

func reverse(stack *Stack)  {
	if stack.IsEmpty() {
		return
	}
	i := f(stack)
	reverse(stack)
	stack.Push(i)
}


func f(stack *Stack)  int {
	result := stack.Pop()
	if stack.IsEmpty() {
		return result
	}else {
		last := f(stack)
		stack.Push(result)
		return last
	}
}

func TestReverse(t *testing.T)  {
	stack := &Stack{}
	stack.Push(100)
	stack.Push(200)
	stack.Push(300)
	reverse(stack)

	for !stack.IsEmpty() {
		fmt.Println(stack.Pop())
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

metabit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值