嵌入式技术
不借助其他数据结构,如何实现栈的逆序?这是一道非常经典的算法笔试题。
所谓栈的逆序,就是把元素12345变成54321。
如果允许再来一个栈结构的话,那过程就会非常简单,只要把第一个栈中的栈顶元素不停的出栈,再进入第二个栈中,就能解决问题。
但是题目明确规定,不允许借助其他数据结构。所以问题就变得复杂一些。
我们知道,在调用函数的时候,也会用到栈这种结构。于是,这个就成了解决问题的关键,可以借助递归来实现。
第一步,看下如何在不借助其他数据结构的情况下,能把栈底元素取出来。 也就是让栈里面的元素变成1234,把5丢掉。
假设函数名叫做delete,在delete函数中做的第一件事就是让栈顶元素出栈,而且也只能执行一次,如果连续出栈的话,就得开辟数组来保存这些元素,很显然违背了题目的本意。
int delete(Stack *s) { int result = pop(s); }刚才出栈的元素被记在了变量中,这个变量叫做局部变量,只要函数调用没有结束,他就一直存在不会被释放。
int delete(Stack *s) { int result = pop(s); if (isEmpty(s)) { return result; } else { int last = delete(s); push(s, result); return last; } }
void reverse(Stack *s) { if (isEmpty(s)) { return; } int i = delete(s); reverse(s); push(s, i); }代码也是非常简单,其实就是调用了三个函数,delete reverse push,再加上一个判断。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !