如何仅用递归函数和栈的操作逆序一个栈

【说明】  

  本文是左程云老师所著的《程序员面试代码指南》第一章中如何仅用递归函数和栈的操作逆序一个栈这一题目的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;
}
View Code

注:

  转载请注明出处;

  转载请注明源思路来自于左程云老师的《程序员代码面试指南》。

原文地址:https://www.cnblogs.com/PrimeLife/p/5316220.html