程序员面试题精选100题(39)-颠倒栈[数据结构]
题目:用递归颠倒一个栈。例如输入栈{1, 2, 3, 4, 5},1在栈顶。颠倒之后的栈为{5, 4, 3, 2, 1},5处在栈顶。
分析:乍一看到这道题目,第一反应是把栈里的所有元素逐一pop出来,放到一个数组里,然后在数组里颠倒所有元素,最后把数组中的所有元素逐一push进入栈。这时栈也就颠倒过来了。颠倒一个数组是一件很容易的事情。不过这种思路需要显示分配一个长度为O(n)的数组,而且也没有充分利用递归的特性。
我们再来考虑怎么递归。我们把栈{1, 2, 3, 4, 5}看成由两部分组成:栈顶元素1和剩下的部分{2, 3, 4, 5}。如果我们能把{2, 3, 4, 5}颠倒过来,变成{5, 4, 3, 2},然后在把原来的栈顶元素1放到底部,那么就整个栈就颠倒过来了,变成{5, 4, 3, 2, 1}。
接下来我们需要考虑两件事情:一是如何把{2, 3, 4, 5}颠倒过来变成{5, 4, 3, 2}。我们只要把{2, 3, 4, 5}看成由两部分组成:栈顶元素2和剩下的部分{3, 4, 5}。我们只要把{3, 4, 5}先颠倒过来变成{5, 4, 3},然后再把之前的栈顶元素2放到最底部,也就变成了{5, 4, 3, 2}。
至于怎么把{3, 4, 5}颠倒过来……很多读者可能都想到这就是递归。也就是每一次试图颠倒一个栈的时候,现在栈顶元素pop出来,再颠倒剩下的元素组成的栈,最后把之前的栈顶元素放到剩下元素组成的栈的底部。递归结束的条件是剩下的栈已经空了。这种思路的代码如下:
// Reverse a stack recursively in three steps:
// 1. Pop the top element
// 2. Reverse the remaining stack
// 3. Add the top element to the bottom of the remaining stack
相关文章
- 程序员面试题精选100题(06)-整数二进制表示中1的个数[算法]
- 程序员面试题精选100题(51)-顺时针打印矩阵[算法]
- 程序员面试题精选100题(23)-跳台阶问题[算法]
- 程序员面试题精选100题(35)-两链表的第一个公共结点[数据结构]
- 程序员面试题精选100题(25)-在从1到n的正数中1出现的次数[算法]
- 程序员面试题精选100题(13)-第一个只出现一次的字符
- 程序员面试题精选100题(61)-数对之差的最大值[算法]
- 安庆潜山事业单位面试真题汇总
- 程序员面试题精选100题(50)-树的子结构[数据结构]
- 程序员面试题精选100题(15)-含有指针成员的类的拷贝[C/C++/C#]
热门推荐
- 程序员面试题精选100题(06)-整数二进制表示中1的个数[算法]
- 程序员面试题精选100题(51)-顺时针打印矩阵[算法]
- 程序员面试题精选100题(23)-跳台阶问题[算法]
- 程序员面试题精选100题(35)-两链表的第一个公共结点[数据结构]
- 程序员面试题精选100题(25)-在从1到n的正数中1出现的次数[算法]
- 程序员面试题精选100题(13)-第一个只出现一次的字符
- 程序员面试题精选100题(61)-数对之差的最大值[算法]
- 安庆潜山事业单位面试真题汇总
- 程序员面试题精选100题(50)-树的子结构[数据结构]
- 程序员面试题精选100题(15)-含有指针成员的类的拷贝[C/C++/C#]
