6-2 铁轨 uva 514

较为简单的stack题目

但是还是犯了一些错误:

1、 要想清空栈,直接重新定义较为方便!

2、在if(s.top()==x)时  加上  !s.empty()  否则程序会崩溃

3、 必须要加上i--  错了好久

#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;
}
View Code
#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;
}
View Code
原文地址:https://www.cnblogs.com/bxd123/p/10284508.html