模拟栈进出
方法一:
1 #include<stdio.h> 2 #define MAXSIZE 1000 3 4 typedef struct{ 5 int data[MAXSIZE]; 6 int top; 7 }SqStack; 8 9 int InitStack(SqStack *s){ 10 s->top=-1; 11 return 0; 12 } 13 14 int Push(SqStack *s,int e){ 15 if(s->top==MAXSIZE) return 1; 16 s->top++; 17 s->data[s->top]=e; 18 return 0; 19 } 20 21 int Pop(SqStack *s){ 22 int e; 23 if(s->top==-1) return 1; 24 e = s->data[s->top]; 25 s->top--; 26 return e; 27 } 28 29 int main(){ 30 int m,n,k,i,h; 31 SqStack s,t; 32 scanf("%d%d%d",&m,&n,&k); 33 while(k--){ 34 InitStack(&s); 35 InitStack(&t); 36 for(i=n-1;i>=0;i--){ 37 scanf("%d",&(t.data[i])); 38 } 39 t.top=n-1; 40 i=0; 41 while(i<=n){ 42 if(s.data[s.top]==t.data[t.top]&&s.top!=-1){ 43 Pop(&s); 44 Pop(&t); 45 }else if(s.top<m-1 && i<n){ 46 i++; 47 Push(&s,i); 48 }else{ 49 break; 50 } 51 } 52 if(s.top==-1 && t.top==-1){ 53 printf("YES "); 54 }else{ 55 printf("NO "); 56 } 57 } 58 return 0; 59 }
分析:
1、自定义栈
2、通过两个栈模拟进出
方法二:
1 #include<stdio.h> 2 #include<iostream> 3 #include<vector> 4 #include<stack> 5 using namespace std; 6 7 int M,N,K; 8 9 int Check(vector<int> &v) { 10 int i=0; 11 int num=1; 12 int cap=M+1; 13 stack<int> sta; 14 sta.push(0); 15 while(i<N) { 16 while(v[i]>sta.top()&&sta.size()<cap) 17 sta.push(num++); 18 if(v[i++]==sta.top()) 19 sta.pop(); 20 else 21 return 0; 22 } 23 return 1; 24 } 25 26 int main() { 27 vector<int> vec(N,0); 28 scanf("%d%d%d",&M,&N,&K); 29 for(int i=0; i<K; i++) { 30 for(int j=0; j<N; j++) { 31 int number; 32 scanf("%d",&number); 33 vec.push_back(number); 34 } 35 if(Check(vec)) printf("YES "); 36 else printf("NO "); 37 vec.clear(); 38 } 39 return 0; 40 }
分析:
1、利用c++容器vector和stack模拟