【说明】
本文是左程云老师所著的《程序员面试代码指南》第一章中“如何仅用递归函数和栈的操作逆序一个栈”这一题目的C++复现;
本文只包含问题描述、C++代码的实现以及简单的思路,不包含解析说明,具体的问题解析请参考原书;
感谢左程云老师的支持。
【题目】:
一个栈依次压入1、2、3、4、5,那么从栈顶到栈底分别为5、4、3、2、1.将这个栈转置后,从栈顶到栈底为1、2、3、4、5,也就是实现栈中元素的逆序。
【要求】:
只能用递归函数实现,且数据结构只能使用栈。
【思路】:
取出栈底元素后,将栈进行逆序,最后将取出的栈底元素压入到栈顶。
【编译环境】:
CentOS6.7(x86_64)
gcc 4.4.7
【实现】:
实现+测试代码


/* *文件名:restack.cpp *作者: *摘要:使用递归的方法逆序一个栈 */ #include <iostream> #include <stack> using namespace std; int popLast(stack<int> &s) { int tmp = s.top(); s.pop(); if(s.empty()) return tmp; else { int last=popLast(s); s.push(tmp); return last; } } void reStack(stack<int> &s) { if(s.empty()) return ; int tmp = popLast(s); reStack(s); s.push(tmp); return ; } int main() { stack<int> s; int a[]={1,2,3,4,5}; int i; for(i=0;i<5;i++) s.push(a[i]); cout << "Before Reverse:" << endl; for(i=0;i<5;i++) { cout << s.top() << endl; s.pop(); } for(i=0;i<5;i++) s.push(a[i]); reStack(s); cout << "After Reverse:" << endl; for(i=0;i<5;i++) { cout << s.top() << endl; s.pop(); } return 0; }
注:
转载请注明出处;
转载请注明源思路来自于左程云老师的《程序员代码面试指南》。