oj1060:合法栈输出:给定一个n,输出从1到n这n个数所有合法的出栈序列.

oj1060:合法栈输出

原题

在这里插入图片描述

分析和代码

题目要求是输出所有的出栈序列,因此如果我们用栈来模拟这个情况,那就基本不会出错,但是事与愿违,无论如何书写代码,得到的结果都不能满足要求,最终在不断尝试中实现了代码,当然也参考了一些其他的代码,下面给上分析:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下面附上AC的代码:

#include <iostream>
#include <stack>
#include <queue>
using namespace std;

int n;
void solve(queue<int>a1, stack<int>s, queue<int>a2);
void one(queue<int>a1, stack<int>s, queue<int>a2);  
void two(queue<int>a1, stack<int>s, queue<int>a2); 

int main()
{
    
    
    queue<int> a1; 
    stack<int> s;  
    queue<int> a2; 
    while(cin>>n)
    {
    
    
        for (int i=1;i<=n;i++)
            a1.push(i);
        solve(a1, s, a2);
        for (int i=0;i<n;i++)
            a1.pop();
    }
    return 0;
}

void solve(queue<int>a1, stack<int>s, queue<int>a2)
{
    
    
    if(a1.empty()&&s.empty())   
    {
    
    
        while(!a2.empty())
        {
    
    
            cout << a2.front();
            a2.pop();
        }
        cout << endl;
        return;
    }
    two(a1, s, a2);
    one(a1, s, a2);
}

void one(queue<int>a1, stack<int>s, queue<int>a2) 
{
    
    
    if(a1.empty()) 
        return;
    s.push(a1.front());
    a1.pop();
    solve(a1,s,a2);
}

void two(queue<int>a1, stack<int>s, queue<int>a2) 
{
    
    
    if(s.empty())  
        return;
    a2.push(s.top());
    s.pop();
    solve(a1,s,a2);
}

附上结果:

在这里插入图片描述
如果对您有所帮助的话,不妨点个赞呗!

猜你喜欢

转载自blog.csdn.net/Freedom_cao/article/details/108449041