题目描述:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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。
样例输入:
5
1 2 3 4 5
4 5 3 2 1
5
1 2 3 4 5
4 3 5 1 2
样例输出:
Yes
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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。
样例输入:
5
1 2 3 4 5
4 5 3 2 1
5
1 2 3 4 5
4 3 5 1 2
样例输出:
Yes
No
推荐指数:※※
来源:http://ac.jobdu.com/problem.php?pid=1366
这道题也是模拟stack的操作,和http://blog.csdn.net/zhu_liangwei/article/details/9699695这道题思想类似。
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
bool check_stack(int *s,int *pops,int n)
{
int top,pop_now,curr;
top=0,pop_now=1,curr=0;//top: stack top now;pop_now:now to handle;curr:first wait to push
int *st= new int[n+1];
while(pop_now<=n&&curr<=n){
if(0==top||st[top]!=pops[pop_now]){
if(top+1>n)
return false;
else
st[++top]=s[++curr];
}
else //if equal, emulate operate of pop
{
top--;
pop_now++;
}
}
if(top>0)
return false;
return true;
}
int main()
{
int n,i;
while(scanf("%d",&n)!=EOF){
int *st=new int[n+1];
int *arr=new int [n+1];
for(i=1;i<=n;i++)
scanf("%d",&st[i]);
for(i=1;i<=n;i++)
scanf("%d",&arr[i]);
if(check_stack(st,arr,n)==false)
printf("No\n");
else
printf("Yes\n");
}
return 0;
}