1068 - 出栈合法性
已知自然数1,2,...,N(1<=N<=100)依次入栈,请问序列C1,C2,...,CN是否为合法的出栈序列。
题目输入
输入包含多组测试数据。
每组测试数据的第一行为整数N(1<=N<=100),当N=0时,输入结束。
第二行为N个正整数,以空格隔开,为出栈序列。
题目输出
对于每组输入,输出结果为一行字符串。
如给出的序列是合法的出栈序列,则输出Yes,否则输出No。
输入/输出样例
题目输入
5 3 4 2 1 5 5 3 5 1 4 2 0
题目输出
Yes No
C语言解答
#include <stdio.h> void main() { int i,a[100],k,count,key,n,j,b[100]; scanf("%d",&n); while(n!=0) { k=key=0; for(i=0;i<n;i++) scanf("%d",&a[i]); for(i=0;i<n;i++) { count=0; for(j=i+1;j<n;j++) { if(a[j]<a[i]) {b[count]=a[j]; count++;} } for(k=0;k<count-1;k++) { if(b[k]<b[k+1]) key=1; } } if(key==0) printf("Yes\n"); else printf("No\n"); scanf("%d",&n); } }
C++解答
#include <stdio.h> int top; int Stack(int stack[], int a, int &pre) { if (a <= pre) { if (stack[--top] != a) { //printf("%d %d\n", stack[top],a); return 0; } else return 1; } for (int i = pre + 1; i <= a; i++) { stack[top++] = i; } top--; pre = a; return 1; } int main(int argc, char *argv[]) { int n; int a, stack[105]; while (scanf("%d", &n) != EOF) { if(n==0) break; top = 1; stack[0]=0; int pre = 0; int flag = 1; for (int i = 0; i < n; i++) { scanf("%d", &a); if (flag == 1) { flag = Stack(stack, a, pre); /*for (int j=1; j<top; j++ ) { printf("%d ",stack[j]); } printf("\n");*/ } } if (flag == 1) { printf("Yes\n"); }else printf("No\n"); } return 0; }