如何仅用递归函数和栈操作逆序一个栈
一、题目
将一个栈用递归实现逆序,即:插入栈比如是:1、2、3、4、5。栈中存储从底到顶是1、2、3、4、5。逆序后,希望存储的从底到顶是5、4、3、2、1。只能使用递归
二、思路
递归就是使用了操作系统为我们程序提供的栈空间,这块空间也是栈结构。也就是说我们需要操作系统的栈为我们存储什么东西。我们标记操作系统的栈为 A;业务栈为 B。
在这个题目中,我们需要栈 A 为我们保存栈 B 每一个元素。因此,
- 我们先做第一步,拿到栈 B 的最底的元素,并让他出栈 B。这个过程也利用操作系统栈来保存栈 B 从底到顶的元素。
- 依次循环第一步操作,并把每次操作得到的元素保存起来。结束后,再插入回栈 B 即可。这个保存的动作需要操作系统栈。
三、code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| #include <stack> #include <iostream> #include <vector> #include <algorithm>
class Solution { public: void push(std::vector<int> vec) { std::for_each(vec.begin(), vec.end(), [&](int val) { st.push(val); }); } void print() { std::stack<int> tmp_st; while (!st.empty()) { tmp_st.push(st.top()); st.pop(); } while (!tmp_st.empty()) { int val = tmp_st.top(); std::cout << val << " "; st.push(val); tmp_st.pop(); } std::cout << std::endl; } void reverse_stack() { if (st.empty()) { return; } int last = get_stack_bottom_elem(); reverse_stack(); st.push(last); }
private: int get_stack_bottom_elem() { int result = st.top(); st.pop(); if (st.empty()) { return result; } else { int last = get_stack_bottom_elem(); st.push(result); return last; } }
private: std::stack<int> st; };
int main() { Solution s; s.push({1, 2, 3, 4, 5}); s.print(); s.reverse_stack(); s.print(); }
|