码迷,mamicode.com
首页 > 其他好文 > 详细

Pop Sequence (25)

时间:2015-06-05 19:23:22      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:

已知栈的输入序列,给出一个输出序列,检查能否按此顺序输出?

怎么做?

输入 1 2 3 4 5
输出 1 4 3 2 5
最大容量3

我们把输入和输出都定义为队列( 模仿输入输出流嘛 )

再定义一个堆栈,上面的例子该怎么检查呢?

要输出的第一个数是1
我就从in里取数到stack,直取stack的top元素是1为止
in 2 3 4 5
out 1 4 3 2 5
stack 1
这时同时pop out和stack
in 2 3 4 5
out 4 3 2 5
stack
要输出4
我就从in里取数到stack,直取stack的top元素是4为止
in 5
out 4 3 2 5
stack 2 3 4
这时同时pop out和stack
in 5
out 3 2 5
stack 2 3
发现此时out front和stack top相等
继续pop
in 5
out 5
stack
一直重复,直到out队列为空,也就是说我们可以按out队列的次序输出
最后一步不赘述咯

那么什么情况下,应该判定不能按out的序列输出呢?

1.stack中元素数量超过了上限

2.out中还有元素要输出,而in已经是空队列了

 

贴上代码

#include <iostream>
#include <queue>
#include <stack>
using namespace std;
int n;
unsigned stackMaxSize;
bool fun(queue<int> out);
int main()
{
    int k;
    cin >> stackMaxSize >> n >> k;
    queue<int> out;

    for (int j = 0; j < k; j++){
        while (out.empty()!=true){
            out.pop();
        }
        for (int i = 0; i < n; i++){
            int getNum;
            cin >> getNum;
            out.push(getNum);
        }
        if (fun(out)){
            cout << "YES" << endl;
        }
        else{
            cout << "NO" << endl;
        }
    }
}
bool fun(queue<int> out)
{
    queue<int> in;
    for (int i = 1; i <= n; i++){
        in.push(i);
    }

    stack<int> process;
    while (out.empty() != true){
        while (process.empty() || process.top() != out.front()){
            if (in.empty() == true){
                return false;
            }
            process.push(in.front());
            in.pop();
            if (process.size() > stackMaxSize){
                return false;
            }
        }
        process.pop();
        out.pop();
    }
    return true;
}

 

Pop Sequence (25)

标签:

原文地址:http://www.cnblogs.com/zhouyiji/p/4555185.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!