不借助其他数据结构,如何实现栈的逆序?这是一道非常经典的算法笔试题。
所谓栈的逆序,就是把元素12345变成54321。
如果允许再来一个栈结构的话,那过程就会非常简单,只要把第一个栈中的栈顶元素不停的出栈,再进入第二个栈中,就能解决问题。
但是题目明确规定,不允许借助其他数据结构。所以问题就变得复杂一些。
我们知道,在调用函数的时候,也会用到栈这种结构。于是,这个就成了解决问题的关键,可以借助递归来实现。
第一步,看下如何在不借助其他数据结构的情况下,能把栈底元素取出来。 也就是让栈里面的元素变成1234,把5丢掉。
假设函数名叫做delete,在delete函数中做的第一件事就是让栈顶元素出栈,而且也只能执行一次,如果连续出栈的话,就得开辟数组来保存这些元素,很显然违背了题目的本意。
int delete(stack *s){ int result = pop(s);} 刚才出栈的元素被记在了变量中,这个变量叫做局部变量,只要函数调用没有结束,他就一直存在不会被释放。
于是在delete函数中再次调用delete函数,又会出栈一个元素,注意,已经出栈的两个元素都还在内存中,因为函数调用没有结束。不停的调用delete,迟早会把栈里面的元素清空,然后再回头操作,把这些还在内
存里面的元素逐个在进栈放回去。int delete(stack *s){ int result = pop(s); if (isempty(s)) { return result; } else { int last = delete(s); push(s, result); return last; }}
最终得到的就是1234,delete函数返回5。过程理解起来比较复杂, 但是代码确实很简单,这也是递归的特点。
第二步,在delete函数的基础上,继续实现栈的逆序。
原理一样,还是得递归。
假设逆序的函数叫做reverse。reverse函数要做的第一件事就是获得栈底元素,就是刚才写的delete函数,然后再次调用reverse函数,再获得栈底元素,这些元素都被记在了内存中,因为函数调用没有结束,所以也不会被释放。当栈变成空栈的时候,再把刚才那些元素逐个进栈,最终得到的就是被反转的栈。void reverse(stack *s){ if (isempty(s)) { return; } int i = delete(s); reverse(s); push(s, i);} 代码也是非常简单,其实就是调用了三个函数,delete reverse push,再加上一个判断。
这是一段很经典的代码,如果你有就业需求,建议直接背下来。
很多同学都在纠结,做嵌入式开发要不要学习算法,因为算法太难了。其实不仅是嵌入式开发,只要是写代码,都得涉及一些算法,只是多少和深浅的问题,如果你打算挑战大厂的嵌入式开发岗位,算法务必得多刷。
射频工程师的具体工作内容有哪些呢?
小米发布米家变频滚筒洗衣机1S 定价1299元
雷军:我的行业太恐怖!
曝三星突然撤销中国七大支社,还将继续裁员
博途VASS6-Profinet诊断简述
嵌入式开发经典算法之栈逆序
TI智能家居和家庭健康医疗展区介绍
deovo公司介绍_deovo是什么牌子
华勤技术蝉联五年全球智能手机和平板ODM行业第一
2017年中国物联网行业细分市场总结报告,看好学好把握未来趋势
提高发动机进气及排气性能的传感器
什么才是下一个推动教育创新的科技?人工智能、虚拟现实还是其他意想不到的新技术?
三星表示年底前对DRAM芯片需求不会有变 明年需求将持续强劲
BIM技术在装配式中有什么价值存在
loto仪器_如何模拟输出凸轮轴和曲轴波形_用任意波形信号源SIG852?
中兴Blade20smart孝心版上架 售价999元
符合 ISO 26262 标准的模型验证咨询服务
云通讯平台,为开发者提供语音通信的黑匣子
2018动力电池价格趋势 或产能过剩达到巅峰
IDT推出符合英特尔凌动处理器要求的创新型电源管理解决方案