- 题目描述:
-
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
- 输入:
-
每个测试案例包括3行:
第一行为1个整数n(1<=n<=100000),表示序列的长度。
第二行包含n个整数,表示栈的压入顺序。
第三行包含n个整数,表示栈的弹出顺序。
- 输出:
-
对应每个测试案例,如果第二个序列是第一个序列的弹出序列输出Yes,否则输出No
-
-
程序实现:
-
#include <iostream> #include <stack> using namespace std; int main() { int nLength; while(cin>>nLength) { stack<int> stackData; int* pPush = new int[nLength]; int* pPop = new int[nLength]; for(int i=0; i < nLength; ++i) cin>>pPush[i]; for(i=0; i < nLength; ++i) cin>>pPop[i]; i = 0; bool bPossible = false; for(int j=0; j<nLength; ++j) { //判断栈顶是否是该元素 if(stackData.size() != 0 && stackData.top() == pPop[j]) stackData.pop(); else //栈顶不是该元素,搜索并压到栈中 { bool find = false; for(; i<nLength;++i) { stackData.push(pPush[i]); if(pPush[i] == pPop[j]) { ++i; find = true; break; } } if(!find) //若把所有元素入栈也没找到,则该序列非正确的出栈顺序 { bPossible = true; break; } else //将元素入栈找到该元素 stackData.pop(); } } if(bPossible) cout<<"不是正确的出栈顺序"<<endl; else cout<<"正确的出栈顺序"<<endl; } return 0; }
-