UVA514 火车站出站问题

来源:互联网 发布:java构造方法不写void 编辑:程序博客网 时间:2024/04/28 18:33

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=455

题目间接:输入N,给定一个序列,判断能否由1~N中的数通过进出栈得到。

思路一:

1:设定一个最大数Max,表示当前进栈到的最大数;

2:先判断序列第一个数j=0,A【j】,从1,2压到A【j】,并Max=A【j】,j后移一位到A【1】

3:

  ①判断Max与A【j】大小,如果Max<A[j],则说明还要继续压栈才能得到A【j】,从Max+1到A【j】依次压栈,并Max=A【j】

  ②如果不满足①条件, 且栈顶元素刚好等于A【j】,出栈得到A【j】,j++

  ③如果不满足①、②条件,说明既不能通过连续压栈得到,也不能通过出栈得到,返回假

4:当栈为空且j>=n时退出循环,表明可以得到该序列

int Judge(int n,int A[]){    stack<int> s;    int i;    for(i=1;i<=A[0];i++)        s.push(i);    int j=0;    int Max=A[0];    while(!s.empty()||j<=n-1)    {        if(Max<A[j])        {            for(i=Max+1;i<=A[j];i++)                s.push(i);            Max=A[j];        }        else if(s.top()==A[j])        {            s.pop();            j++;        }        else { while(!s.empty())                 s.pop();               return 0;             }    }    if(s.empty()) return 1;    else  return 0;}

思路二:

1:创建一个数组a,存放1、 2、 3 ……n,数组b存放输入的序列

2:i,j分别作为数组a、b的迭代器,初值为0

3:每次循环,先判断栈是否为空  ①不空,先比较b【j】和栈顶元素,相等,则j++,跳到下一步循环;

                 ②空栈 或者b【j】!=栈顶元素,则比较a【i】和b【j】,相等则i、j++,不等,则压栈,i++


#include <iostream>#include <stack>#include <cstdio>using namespace std;int main(){    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);int a[1001],i;int n,b[1002];stack<int> s;while(cin>>n){for(i=0;i<n;i++)a[i]=i+1;if(n==0)break;while(cin>>b[0]){if(b[0]==0) break;for(i=1;i<n;i++){cin>>b[i];}int j=0;i=0;while(i<n){if(!s.empty())             //每次优先(判断栈非空,比较栈顶元素和当前序列元素)     {if(s.top()==b[j]){s.pop();    j++;    continue;          //}}                                         //压栈的前提是已经判断出栈顶元素与当前序列元素不等,或者栈为空                if(a[i]!=b[j]) {s.push(a[i]);i++;}                    else {i++;j++;}}while(!s.empty()){if(s.top()==b[j]){s.pop();j++;}else break;}if(s.empty()) cout<<"Yes"<<endl;else cout<<"No"<<endl;while(!s.empty()){s.pop();}}cout<<endl;}return 0;}


0 0
原创粉丝点击