较为简单的stack题目
但是还是犯了一些错误:
1、 要想清空栈,直接重新定义较为方便!
2、在if(s.top()==x)时 加上 !s.empty() 否则程序会崩溃
3、 必须要加上i-- 错了好久
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <bits/stdc++.h> using namespace std; int main() { int a[2005]; int n; while(scanf("%d",&n)&&n) { while(1){ stack<int>s;//方便重置! scanf("%d",&a[1]); if(a[1]==0)break; for(int i=2;i<=n;i++) {scanf("%d",&a[i]);} int ok=1; int j=1; for(int i=1;i<=n;i++) { if(j==a[i]){j++;} else if(!s.empty()&&s.top()==a[i]){s.pop();}//没有 s.empty会崩溃 else if(j<=n){j++;s.push(j-1);i--;}//i--至关重要 !!! else {ok=0;break;} } if(ok)printf("Yes "); else printf("No "); } printf(" "); } return 0; }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; int main() { int n; while(cin>>n&&n) { int a[10000]={0}; while(1){ stack<int>k; scanf("%d",&a[0]);if(a[0]==0)break; for(int i=1;i<n;i++)cin>>a[i]; int ok=1;int j=1; for(int i=0;i<n;i++) { if(a[i]==j){j++;continue;} else if(!k.empty()&&a[i]==k.top()){k.pop();continue;} else if(j<a[i]) { while(j<a[i]) { k.push(j);j++; } j++; } else {ok=0;break;} } if(ok)printf("Yes ");else printf("No "); } cout<<endl; } return 0; }