时间限制: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<stdio.h> #define SIZE 100000 int push[SIZE]; int pop[SIZE]; int stack[SIZE]; int n; int isPopSqueue(){//返回类型可以使bool型,但是在九度里面以C的方式运行时,如果是bool型会报错,可能原因是那边的C编译器比较老吧。bool类型是在C99里面新增的类型。 int top=-1,i=0,j=0,temp=-1; while(j<n){ if(i<n) stack[++top] = push[i++]; else temp=j; while(top>=0 && stack[top] == pop[j] ){ j++; top--; } if( temp == j) return 0; } return 1; } int main() { while(scanf("%d",&n)!=EOF){ for(int i=0;i<n;i++) scanf("%d",&push[i]); for(int i=0;i<n;i++) scanf("%d",&pop[i]); if(isPopSqueue()) printf("Yes\n"); else printf("No\n"); } return 0; }
方法2:(C和C++方式提交都可以)
<pre name="code" class="cpp">#include<stdio.h> #define SIZE 100000 int push[SIZE]; int pop[SIZE]; int stack[SIZE]; int n; int isstack(){ int top = -1, i = 0, j = 0; while(i<n){ if(top>=0&&pop[j] == stack[top]){ top--; j++; } else if(push[i] == pop[j]){ i++; j++; }else{ stack[++top]=push[i++]; } } while(j<n){ if(top>=0&&pop[j] == stack[top]){ top--; j++; }else return 0; } return 0; } int main() { while(scanf("%d",&n)!=EOF){ for(int i=0;i<n;i++) scanf("%d",&push[i]); for(int i=0;i<n;i++) scanf("%d",&pop[i]); if(isstack()) //if(isPopSqueue()) printf("Yes\n"); else printf("No\n"); } return 0; }
方法三:include<stdio.h> #define MAXSIZE 100000 int str1[MAXSIZE]; int st[MAXSIZE]; int main() { <span style="white-space:pre"> </span>int n; <span style="white-space:pre"> </span>int top; <span style="white-space:pre"> </span>while(scanf("%d",&n)!=EOF&&n!=0){ <span style="white-space:pre"> </span>for(int i=0; i< n;i++){ <span style="white-space:pre"> </span>scanf("%d",&str1[i]); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>top = -1; <span style="white-space:pre"> </span>int index = 0; <span style="white-space:pre"> </span>int val; <span style="white-space:pre"> </span>int k = n; <span style="white-space:pre"> </span>while(k--){ <span style="white-space:pre"> </span>scanf("%d",&val); <span style="white-space:pre"> </span>if(top >= 0 && st[top] == val){ <span style="white-space:pre"> </span>top--; <span style="white-space:pre"> </span>}else{ <span style="white-space:pre"> </span>while(str1[index]!=val&&index<n){ <span style="white-space:pre"> </span>st[++top]= str1[index++]; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>++index; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>if(top == -1) <span style="white-space:pre"> </span>printf("Yes\n"); <span style="white-space:pre"> </span>else <span style="white-space:pre"> </span>printf("No\n"); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>return 0; }
bool类型扩展知识:首先请大家回想一下,在你们所编写的C程序中,是否使用过bool(布尔)类型?bool类型一般用来表示真假,是程序设计中一个很基本的数据类型。但是,C语言里面并不直接支持bool类型。一些初学C语言,或者是对C语言不是很精通的朋友肯定觉得很奇怪,为什么在C++,JAVA等语言里使用的bool类型,在C语言里无法使用了呢?
问题解析 bool类型的变量,为0时表示为假,为非0时表示为真。但是原始C语言中并不支持bool类型,若需要使用bool类型可以借用int类型自己定义一下,例如:
[cpp] typedef int bool; #define TRUE 1 #define FALSE 0
然后就可以在程序中使用bool类型了。用32位的int类型来当bool使用,这样无疑浪费了内存资源,因此对于内存敏感的程序中可以使用char来定义bool类型:
[cpp] typedef char bool; #define TRUE 1 #define FALSE 0
进一步讨论 C语言并非没有bool类型,而是在C99标准之前没有。C99标准中新增的头文件中引入了bool类型,与C++中的bool兼容。该头文件为stdbool.h,其源码如下所示:
[cpp] #ifndef _STDBOOL_H #define _STDBOOL_H #ifndef __cplusplus #define bool _Bool #define true 1 #define false 0 #else /* __cplusplus */ /* Supporting <stdbool.h> in C++ is a GCC extension. */ #define _Bool bool #define bool bool #define false false #define true true #endif /* __cplusplus */ /* Signal that all the definitions are present. */ #define __bool_true_false_are_defined 1#endif /* stdbool.h */
代码中的_Bool是C99标准为bool类型引入的新的关键字,sizeof(_Bool)的值为1,表面其为bool类型。既然为bool类型,那么0表示为假,其他任何值都表示为真,我们可以做一个小实验来测试一下: [cpp] bool bb=10; bool aa=0; printf(" %d %d \n",bb,aa);
输出的结果为1和0,这表明bool类型变量赋值为非0值得时候,只存储其值为1。
最后,当需要使用bool类型时,推荐使用C99标准的bool类型而不是自己去定义,引入头文件<stdbool.h>即可,该头文件位于
/usr/lib/gcc/i386-redhat-linux/4.1.1/include/stdbool.h(以我自己的Linux系统为例)。