标签:
已知栈的输入序列,给出一个输出序列,检查能否按此顺序输出?
怎么做?
输入 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; }
标签:
原文地址:http://www.cnblogs.com/zhouyiji/p/4555185.html