题目1366:栈的压入、弹出序列
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:2364
解决:894
- 题目描述:
-
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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。
- 样例输入:
-
51 2 3 4 54 5 3 2 151 2 3 4 54 3 5 1 2
- 样例输出:
-
Yes
-
No
-
#include <stack> #include <cstdio> using namespace std; bool judge(int *stack_in,int *stack_out,int n) { stack<int> st; int j=0; bool is_valid=true; for(int i=0;i<n;i++) { if(st.size()>0&&stack_out[i]==st.top()) st.pop(); else { bool find=false; for(;j<n;j++) { st.push(stack_in[j]); if(stack_in[j]==stack_out[i]) { j++; find=true; break; } } if(find) st.pop(); else { is_valid=false; break; } } } return is_valid; } int main() { int n; int i,j; bool is_valid; while(scanf("%d",&n)!=EOF) { int *stack_in=new int[n]; int *stack_out=new int[n]; for(i=0;i<n;i++) scanf("%d",&stack_in[i]); for(j=0;j<n;j++) scanf("%d",&stack_out[j]); is_valid=judge(stack_in,stack_out,n); if(is_valid) printf("Yes\n"); else printf("No\n"); delete[] stack_in; delete[] stack_out; } return 0; } /************************************************************** Problem: 1366 User: road Language: C++ Result: Accepted Time:190 ms Memory:2228 kb ****************************************************************/