合法栈输出

    科技2024-10-17  21

    合法栈输出

    一,基本思想二、过程分析三,代码实现

    一,基本思想

    既然要求合法栈输出,那就用栈作为中间容器来进行操作用队列来保存输入和输出的数据,输出的结果自然会满足题目要求。

    主要部分是递归和分类,每递归一次可以有两种选择: 1,中间栈将一个数据转移至输出队列中; 2,中间栈数据不动,将输入队列中的一个数据转移至中间栈中。

    为了使三个容器在一次递归中可以将以上两种操作都进行,每次递归要对三个容器的进行复制,然后用本体和复制体分别执行操作一和操作二。


    二、过程分析


    三,代码实现

    #include<iostream> #include<queue> #include<stack> using namespace std; int n; void output(queue<int> inqueue, stack<int> sta, queue<int> outqueue) { if (sta.size() == n ) { while (!sta.empty()) { cout << sta.top(); sta.pop(); } cout << endl; return; } if (outqueue.size() == n) { while (!outqueue.empty()) { cout << outqueue.front(); outqueue.pop(); } cout << endl; return; } queue<int> inqcopy = inqueue; stack<int> stcopy = sta; queue<int> outcopy = outqueue; if (!stcopy.empty()) //第一种选择,将栈中的一个数据移到输出队列中 { outcopy.push(stcopy.top()); stcopy.pop(); output(inqcopy, stcopy, outcopy); } if (!inqueue.empty()) //第二种选择,不动栈中已有的数据,将输入队列中的一个数据移到栈中 { sta.push(inqueue.front()); inqueue.pop(); output(inqueue, sta, outqueue); } return; } int main() { cin >> n; queue<int> inqueue; stack<int> sta; queue<int> outqueue; for (int i = 1; i <= n; ++i) { inqueue.push(i); } output(inqueue, sta, outqueue); return 0; }

    输入输出信息:

    Processed: 0.021, SQL: 8