实验二——栈和队列的基本操作及应用

实验内容和要求

[Description]

There is a famous railway station in PopPush City. Country there is incredibly hilly. The station was built in last century. Unfortunately, funds were extremely limited that time. It was possible to establish only a surface track. Moreover, it turned out that the station could be only a dead-end one (see picture) and due to lack of available space it could have only one track.

The local tradition is that every train arriving from the direction A continues in the direction B with coaches reorganized in some way. Assume that the train arriving from the direction A has N <= 1000 coaches numbered in increasing order 1, 2, ..., N. The chief for train reorganizations must know whether it is possible to marshal coaches continuing in the direction B so that their order will be a1, a2, ..., aN. Help him and write a program that decides whether it is possible to get the required order of coaches. You can assume that single coaches can be disconnected from the train before they enter the station and that they can move themselves until they are on the track in the direction B. You can also suppose that at any time there can be located as many coaches as necessary in the station. But once a coach has entered the station it cannot return to the track in the direction A and also once it has left the station in the direction B it cannot return back to the station.

[Input]

The input consists of blocks of lines. Each block except the last describes one train and possibly more requirements for its reorganization. In the first line of the block there is the integer N described above. In each of the next lines of the block there is a permutation of 1, 2, ..., N. The last line of the block contains just 0.

The last block consists of just one line containing 0.

[Output]

The output contains the lines corresponding to the lines with permutations in the input. A line of the output contains Yes if it is possible to marshal the coaches in the order required on the corresponding line of the input. Otherwise it contains No. In addition, there is one empty line after the lines corresponding to one block of the input. There is no line in the output corresponding to the last ``null'' block of the input.

[Sample Input]

5

1 2 3 4 5

5 4 1 2 3

0

6

6 5 4 3 2 1

0

0

[Sample Output]

Yes

No

Yes

主要思想

题目大意即为判断从1到n的n个数进栈,能否按所给顺序出栈。方法为使用for循环从1到n依次入栈,每次入栈都进行判断:在栈不为空的情况下,栈顶元素是否与所给序列的第p个数相等,如果相等,则元素出栈,p的值加1。循环n次后,入栈完毕,如果p等于序列大小加1,则说明所有元素都出栈成功。

代码实现

#include<cstdio>
#include<string.h>
#define MAX_N 1005
int a[MAX_N];
typedef struct{//顺序栈的定义
    int *base;
    int *top;
    int stacksize;
}Sqstack;
Sqstack S;
int InitStack(){//栈的初始化
    S.base=new int[MAX_N];
    if(!S.base)
        return 0;
    S.top=S.base;
    S.stacksize=MAX_N;
    return 1;
}
int Push(int e){//进栈
    if(S.top-S.base==MAX_N)
        return 0;
    *S.top++=e;
    return 1;
}
int Pop(){//出栈
    if(S.top==S.base)
        return 0;
    S.top--;
    return 1;
}
int GetTop(){//取栈顶元素
    if(S.top!=S.base)
        return *(S.top-1);
}
int main(){
    int n;
    if(!InitStack())
        return 0;
    while(scanf("%d",&n)!=EOF&&n){
        int i=0;
        while(1){
            memset(a,0,sizeof(a));//对数组初始化
            S.top=S.base;//强制把栈清空
            scanf("%d",&a[1]);
            if(a[1]==0){
                printf("\n");//输入0后,换行跳出
                break;
            }
            else{
                for(i=2;i<=n;i++)
                    scanf("%d",&a[i]);
                int p=1;
                i=1;
               for(int i = 1; i <= n; i++)
               {
                Push(i);//按顺序入栈
                while( S.top!=S.base&&GetTop()==a[p])
                {
                    Pop();//栈不为空且栈顶元素与所给序列的第p个元素相等
                    p++;//序列继续向后比
                }
               }
               if(p == n+1)//整个序列都比完,说明都能顺利出栈
                    printf("Yes\n");
               else
                    printf("No\n");
        }
    }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/DEAR_CXN/article/details/86567137