[PTA]02-线性结构4 Pop Sequence (25分)

原题:

Given a stack which can keep M numbers at most. Push N numbers in the order of 1, 2, 3, …, N and pop randomly. You are supposed to tell if a given sequence of numbers is a possible pop sequence of the stack. For example, if M is 5 and N is 7, we can obtain 1, 2, 3, 4, 5, 6, 7 from the stack, but not 3, 2, 1, 7, 5, 6, 4.

Input Specification:

Each input file contains one test case. For each case, the first line contains 3 numbers (all no more than 1000): M (the maximum capacity of the stack), N (the length of push sequence), and K (the number of pop sequences to be checked). Then K lines follow, each contains a pop sequence of N numbers. All the numbers in a line are separated by a space.

Output Specification:

For each pop sequence, print in one line “YES” if it is indeed a possible pop sequence of the stack, or “NO” if not.

Sample Input:

5 7 5
1 2 3 4 5 6 7
3 2 1 7 5 6 4
7 6 5 4 3 2 1
5 6 4 3 7 2 1
1 7 6 5 4 3 2

Sample Output:

YES
NO
NO
YES
NO

分析

第一行输入栈大小M, 入栈序列长度N, 要检查出栈序列的个数K,入栈序列已经给出为1, 2, 3, …, N,接下来再判断输入的K个的出栈序列是否合理

先生成一个入栈序列保存在数组arr中,读入出栈序列保存在数组input中,之后用while循环开始入栈,每入栈一个元素就判断一次是否栈满,若栈满则直接break,接着再用一次while出栈(当栈顶元素与出栈元素相同时,且栈不为空即栈下标si>=0时出栈)。跳出入栈循环有两种情况,一个是栈满,栈下标si>栈大小m-1,另一个就是入栈完了,此时还要再检查一下出栈序列有没有遍历完,即栈内是否还有元素没有出栈,若没有则说明这样的出栈序列也是无法实现的

C语言完整代码如下

#include <stdio.h>
/* 02-线性结构4 Pop Sequence (25分) */

#define MAX 1000

int main(void)
{
    int arr[MAX], stack[MAX], input[MAX];
    int m, n, k, ai = 0, si = 0, ii = 0;    /* ai, si, ii分别是数组arr, stack, input的下标 */
    
    scanf("%d %d %d", &m, &n, &k);
    for(int i = 1; i <= n; i++) /* 按题目要求生成一个入栈顺序数组1到N */
        arr[i-1] = i;
    for(int j = 0; j < k; j++)
    {
        ai = 0;
        si = -1;    /* 这里stack下标初始化为-1是因为在下方进入while循环中会先+1 */
        ii = 0;
        for(int i = 0; i < n; i++)
            scanf("%d", &input[i]);
        while(ai < n)
        {
            si++;
            stack[si] = arr[ai++];
            if (si > m - 1)     /* 判断是否栈满 */
                break;
            while(stack[si] == input[ii] && si >= 0)    /* 出栈 */
            {
                si--;
                ii++;
            }
        }
        if (si > m - 1 || ii != n)
            printf("NO\n");
        else
            printf("YES\n");
    }
    
    return 0;
}

PTA测试结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值