原题连接:https://www.patest.cn/contests/pat-a-practise/1051
题目:
Given a stack which can keep M numbers at most. Push N numbers in the order of 1, 2, 3, ..., N and pop randomly. You are supposed to tell if a given sequence of numbers is a possible pop sequence of the stack. For example, if M is 5 and N is 7, we can obtain 1, 2, 3, 4, 5, 6, 7 from the stack, but not 3, 2, 1, 7, 5, 6, 4.
Input Specification:
Each input file contains one test case. For each case, the first line contains 3 numbers (all no more than 1000): M (the maximum capacity of the stack), N (the length of push sequence), and K (the number of pop sequences to be checked). Then K lines follow, each contains a pop sequence of N numbers. All the numbers in a line are separated by a space.
Output Specification:
For each pop sequence, print in one line "YES" if it is indeed a possible pop sequence of the stack, or "NO" if not.
Sample Input:5 7 5 1 2 3 4 5 6 7 3 2 1 7 5 6 4 7 6 5 4 3 2 1 5 6 4 3 7 2 1 1 7 6 5 4 3 2Sample Output:
YES NO NO YES NO
这道题我参阅了 http://blog.csdn.net/whzyb1991/article/details/46663867 这篇博文的思路,稍有改动,并且我是用链式存储堆栈,而博文的作者是用顺序存储的方式,读者可以对比两种
方式的优缺点。
这道题并不是有多复杂,关键在于想出it is not a possible pop sequence of the stack的条件!我是苦于没有思路,才参阅了博主的文章。共勉!
我的代码:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<stdbool.h> 4 #define Max 1000 5 typedef struct SNode{ 6 int Data; 7 struct SNode *Next; 8 }Stack; 9 10 Stack *CreateStack() 11 { 12 Stack *Ptrs=(Stack*)malloc(sizeof(struct SNode)); 13 Ptrs->Next=NULL; 14 return Ptrs; 15 } 16 17 bool IsEmpty(Stack *Ptrs) 18 { 19 return(Ptrs->Next==NULL); 20 } 21 22 void Push(Stack *Ptrs,int X) 23 { 24 Stack *S; 25 S=(Stack *)malloc(sizeof(struct SNode)); 26 S->Data=X; 27 S->Next=Ptrs->Next; 28 Ptrs->Next=S; 29 } 30 31 void Pop(Stack *Ptrs) 32 { 33 if(IsEmpty(Ptrs)) return; 34 Stack *FirstCell; 35 FirstCell=Ptrs->Next; 36 Ptrs->Next=FirstCell->Next; 37 free(FirstCell); 38 } 39 /* 计算堆栈的长度 */ 40 int Length(Stack *Ptrs) 41 { 42 Stack *p; 43 p=Ptrs->Next; 44 int cnt =0; 45 while(p) 46 { 47 cnt++; 48 p=p->Next; 49 } 50 return cnt; 51 } 52 /* 检验每一line是否符合要求 */ 53 int check_stack(int *v,int N,int M) 54 { 55 int i=0; 56 int num=1; 57 Stack*ps; 58 ps=CreateStack(); 59 Push(ps,0); //先给栈中压入一个元素0 60 while(i<N) //审核每个已给元素 61 { /* 核心 */ //入栈条件;当前栈顶元素小于已给数字,并且(前提条件)栈内元素的总容量小于栈的容量 62 while(ps->Next->Data<v[i] && Length(ps)<M+1) 63 Push(ps,num++); //压入数num后,由于"the order is 1,2,……N。故下一个压入的数必为num+1; 64 if (ps->Next->Data==v[i]) 65 { 66 Pop(ps); //栈顶元素出栈 67 i++; //之后的栈顶元素和下一个已给元素继续比较 68 } 69 else 70 { 71 free(ps); 72 return 0;} //False! 73 } 74 free(ps); 75 return 1; 76 77 } 78 int main() 79 { 80 int M,N,K; 81 scanf("%d %d %d",&M,&N,&K); 82 83 int *v=(int *)malloc(sizeof(int)*N); 84 int i,j; 85 for(i=0;i<K;i++) 86 { 87 for (j=0;j<N;j++) 88 { 89 scanf("%d",v+j); 90 } 91 if(check_stack(v,N,M))printf("YES "); 92 else printf("NO "); 93 } 94 free(v); 95 return 0; 96 97 }