【栈的应用】输出栈的所有合法输出序列

分析

以123为例,假如123在一个队列里,输入到中间栈,通过中间栈输出到右边队列中(这里用队列是为了方便输出,用数组储存也行)
在这里插入图片描述
我们分析一下中间的过程:在这里插入图片描述
假如1已经入栈,这个时候有两种可能,要么中间栈栈顶的数据移动到右队列中,要么左队列中的数据移动到中间栈中,所以采用递归的方法,从而求出所有可能的情况。递归终止的条件是左队列和中间栈均空。代码如下。

代码部分

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


void input_legal_order(queue<char>a1, stack<char>s, queue<char>a2);
void one(queue<char>a1, stack<char>s, queue<char>a2);  //第一种选择:a1如果不空,把a1的压入到s中
void two(queue<char>a1, stack<char>s, queue<char>a2);  //第二种选择:s如果不空,把s的压入到a2中

int main()
{
    queue<char> a1; //输入栈
    stack<char> s;  //辅助栈
    queue<char> a2; //输出队列
    cout << "请输入序列:";
    char ch;
    ch = cin.get();
    while(ch!='\n')
    {
        a1.push(ch);
        ch = cin.get();
    }
    cout << "合法的输出序列有:" << endl;
    input_legal_order(a1, s, a2);
    return 0;
}

void input_legal_order(queue<char>a1, stack<char>s, queue<char>a2)
{
    if(a1.empty()&&s.empty())   //如果输入栈和辅助栈均空,表明输出完成,数据已经进入a2中
    {
        while(!a2.empty())      //输出a2里的数据
        {
            cout << a2.front();
            a2.pop();
        }
        cout << endl;
        return;
    }
    /*如果输入栈和辅助栈均不空,接下来有两种选择:
     * 1.输出栈中有一个数据弹出并压入辅助栈中
     * 2.辅助栈中有一个数据弹出并压入输出队列中
     * 故采用递归的方法
     */
    one(a1, s, a2);
    two(a1, s, a2);
}

void one(queue<char>a1, stack<char>s, queue<char>a2)  //第一种选择
{
    if(a1.empty())  //如果输出栈空了,直接返回
        return;
    s.push(a1.front());
    a1.pop();
    input_legal_order(a1,s,a2);
}

void two(queue<char>a1, stack<char>s, queue<char>a2)  //第二种选择
{
    if(s.empty())   //如果辅助栈空了,直接返回
        return;
    a2.push(s.top());
    s.pop();
    input_legal_order(a1,s,a2);
}

博主也是刚学数据结构,发出了自己结合网上和个人理解的思路,如果有错误和可以改进的地方,请在评论区留言哦!

猜你喜欢

转载自blog.csdn.net/Thebaldslasher/article/details/105167436