问题

链接:https://www.nowcoder.com/questionTerminal/ba7d7f5d1edf4d1690d66e12e951f6ea
题目来源:牛客网

一个栈依次压入1,2,3,4,5 那么从栈顶到栈底分别为5,4,3,2,1。 将这个栈转置后,从栈顶到栈底为1,2,3,4,5,也就是实现了栈中元素的逆序,请设计一个算法实现逆序栈的操作,但是只能用递归函数来实现,而不能用另外的数据结构。

给定一个栈Stack以及栈的大小top,请返回逆序后的栈。

测试样例:

[1,2,3,4,5],5

返回:

[5,4,3,2,1]

分析

递归(英语:Recursion),又译为递回,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。

通过递归实现栈的逆序,相当于使用函数调用自身完成栈的逆序操作。
因为栈是先进后出,因此先出旧栈的元素要先入新栈,所有旧元素操作完成后,新栈就是原栈的逆序。

代码

#include <stack>
#include <iostream>
 
 
/**
 * 递归处理栈中的元素,并存储结果。
 *
 * @param s 输入的整数栈,作为递归处理的对象。
 * @param s_top 当前栈顶元素的值,用于递归基准条件或计算。
 * @param ret 输出栈,用于存储递归处理后的结果。
 */
void recursion_stack(std::stack<int> &s, int s_top, std::stack<int> &ret) {
    ret.push(s_top);
    s.pop();
 
    if (!s.empty()) {
        return recursion_stack(s, s.top(), ret);
    }
}
 
 
#ifdef _GTEST
 
#include "gtest/gtest.h"
 
TEST(test_recursion_stack, recursion)
{
    std::stack<int> s1, s2, s3;
    std::stack<int> r;
 
    for (size_t i = 1; i <= 5; ++i) {
        s1.push(i);
        s2.push(i);
    }
    for (; !s2.empty(); s2.pop()) {
        s3.push(s2.top());
    }
 
    recursion_stack(s1, s1.top(), r);
 
    for (; !r.empty(); ) {
        EXPECT_EQ(s3.top(), r.top());
        s3.pop();
        r.pop();
    }
}
#endif//_GTEST
 

Build:

g++ -o sr.bin stack_recursion.cpp -g -D_GTEST -lgtest_main -lgtest -I/usr/src/gtest/include -L/usr/lib/x86_64-linux-gnu/

Run:

 ./sr.bin
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from test_recursion_stack
[ RUN      ] test_recursion_stack.recursion
[       OK ] test_recursion_stack.recursion (0 ms)
[----------] 1 test from test_recursion_stack (0 ms total)
 
[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (0 ms total)
[  PASSED  ] 1 test.

*****