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

oj1060:合法栈输出

  • 原题
  • 分析和代码
    • 附上结果:

原题

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

分析和代码

题目要求是输出所有的出栈序列,因此如果我们用栈来模拟这个情况,那就基本不会出错,但是事与愿违,无论如何书写代码,得到的结果都不能满足要求,最终在不断尝试中实现了代码,当然也参考了一些其他的代码,下面给上分析:
oj1060:合法栈输出:给定一个n,输出从1到n这n个数所有合法的出栈序列._第2张图片
oj1060:合法栈输出:给定一个n,输出从1到n这n个数所有合法的出栈序列._第3张图片
oj1060:合法栈输出:给定一个n,输出从1到n这n个数所有合法的出栈序列._第4张图片
oj1060:合法栈输出:给定一个n,输出从1到n这n个数所有合法的出栈序列._第5张图片
下面附上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);
}

附上结果:

oj1060:合法栈输出:给定一个n,输出从1到n这n个数所有合法的出栈序列._第6张图片
如果对您有所帮助的话,不妨点个赞呗!

你可能感兴趣的:(程序设计,OJ,栈,数据结构,算法)