您的位置:首页 > 其它

题目1366:栈的压入、弹出序列

2015-05-28 21:12 281 查看
时间限制:1 秒内存限制:32 兆题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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
分析:使用一个栈来记录实际出栈顺序。
#include <iostream>#include <cstdio>using namespace std;const int N = 100000;int vec1;int vec2;int vec3;bool isValid(int n){int index1 = 0, index2 = 0, index3 = -1;while (index1 < n&& index2 < n){vec3[++index3] = vec1[index1];if (vec1[index1] == vec2[index2]){while (index3 >= 0 && index2 < n && vec3[index3] == vec2[index2]){--index3;++index2;}}++index1;}return index3 == -1;}int main(void){int n;while (scanf("%d", &n) != EOF){for (int i = 0; i < n; ++i)scanf("%d", &vec1[i]);for (int i = 0; i < n; ++i)scanf("%d", &vec2[i]);if (isValid(n))printf("Yes\n");elseprintf("No\n");}return 0;}
[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: