思路如下:
/* 伪码 */ //入栈序列即 1, 2, 3, ..., N 那个序列 //出栈序列即输入的序列 for (遍历整个出栈序列) { while (stack.size() <= M) { if (栈空) stack.push(从固定的入栈序列依次取走一个元素); if (stack.top() == 出栈序列当前元素) { stack.pop(); break; } else { if (固定的入栈序列仍有元素 && stack.size() < M) stack.push(从固定的入栈序列依次取走一个元素); else { cout << "NO\n"; 结束循环; } } } if (stack.size() == M) { cout << "NO\n"; 结束循环; }//因为上面判断了 stack.size() < M 才入栈,也就是说栈最多 M 个元素 } if (上面的 for() 能全部遍历完) cout << "YES\n";
实际上打印完 "NO" 就可以结束循环了,我就懒得再写几个标记位来判断,所以完整代码我把上面的思路封装为函数了,这样每次 "NO" 我只要 retrun 就行了