解法1:(自己码的)
#include <bits/stdc++.h> #include<math.h> #include <string> using namespace std; const int MAXN = 10000; stack<int> stk; int main(){ int M,N,K; scanf("%d%d%d",&M,&N,&K); int temp[N]; bool flag; int size = 0; int current = 0; int minm = 1; for(int i= 0;i<K;++i){ flag = true; size = 0; current = 0; minm = 1; for(int j = 0;j<N;++j){ cin>>temp[j]; /*current = i; while(stk.top() != temp[i]){ stk.push(minm); minm++; size++; if(size > M){ cout<<"No"<<endl; break; } } if(size > M){ break; } stk.pop(); size--; if(j == N-1){ cout<<"Yes"<<endl; }*/ } for(int m = 0;m<N;++m){ //cin>>temp[j]; current = m; while(stk.size() == 0 || stk.top() != temp[current]){ stk.push(minm); minm++; size++; if(size > M){ cout<<"NO"<<endl; break; } } if(size > M){ break; } stk.pop(); size--; if(current == N-1){ cout<<"YES"<<endl; } } } system("pause"); return 0; }
算法笔记版:
#include <bits/stdc++.h> #include<math.h> #include <string> using namespace std; const int maxn = 1010; int arr[maxn];//保存题目给定的出栈序列 stack<int> st; int main(){ int m,n,T; scanf("%d%d%d",&m,&n,&T); while(T--){ while(!st.empty()){//清空栈 st.pop(); } for(int i=1;i<=n;++i){//读入数据 scanf("%d",&arr[i]); } int current = 1;//指向出栈序列中的待出栈元素 bool flag = true; for(int i = 1;i<=n;++i){ st.push(i); if(st.size() > m){//如果此时栈中元素个数大于容量m,则序列非法 flag = false; break; } //栈顶元素与出栈序列当前位置的元素相同时 while(!st.empty() && st.top() == arr[current]){ st.pop(); current++; } } if(st.empty() == true && flag == true){ printf("YES\n"); }else{ printf("NO\n"); } } system("pause"); return 0; }
原文地址:https://www.cnblogs.com/JasonPeng1/p/12207912.html
时间: 2024-10-05 05:50:23