线性结构 Pop Sequence (C语言)

简介: (浙大PTA https://pintia.cn/problem-sets/16/problems/665)

线性结构 Pop Sequence

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.

输入样例:

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

输出样例:

YES
NO
NO
YES
NO

题解

判断出栈序列是否合法,可以用一个栈来模拟出栈顺序。先判断栈是否为空或栈顶元素是否与序列相等,空或者不相等则按照顺序将元素入栈,直到相等或已全部入栈。入栈时要判断栈满,栈满则不能入栈,序列非法。最后栈应该为空,不为空非法。
如序列3 2 1 7 5 6 4,一开始为3,栈空,按照顺序入栈,1,2,3,然后3出栈,2出栈,1出栈。到7,按照顺序入栈4,5,6,7,7出栈。到5与栈顶元素不同,且元素已全部入栈,栈非空,序列非法。

c代码

#include <stdio.h>
#include <stdlib.h>

int k, n, m;

int main() {
    scanf("%d%d%d", &m, &n, &k);
    int* stack = (int *)malloc(sizeof (int) * (m + 5));
    int* sq = (int *)malloc(sizeof (int) * (n + 5));
    
    while (k--) {
        int top = -1;
        for (int i = 1; i <= n; i++) scanf("%d", &sq[i]);   //读入出栈序列
        
        for (int i = 1, j = 1; i <= n; i++ ) {
            stack[++top] = i;    //按顺序入栈
            if(top >= m)  break;   //栈满,非法
            while(top != -1 && stack[top] == sq[j]) {    //判断栈顶元素是否与序列相同
                top--;   
                j++;
            }
        }
        
        if(top == -1)  puts("YES");
        else  puts("NO");
    }
    
    return 0;
}
相关文章
|
9月前
|
算法 C语言 容器
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣(上)
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣
60 0
|
9月前
|
存储 C语言
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣(中)
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣
49 0
|
9月前
|
存储 前端开发 算法
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣(下)
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣
33 0
|
4月前
|
存储 缓存 C语言
C语言:链表和数组有什么区别
C语言中,链表和数组是两种常用的数据结构。数组是一种线性结构,元素在内存中连续存储,通过下标访问,适合随机访问且大小固定的情况。链表由一系列不连续的节点组成,每个节点存储数据和指向下一个节点的指针,适用于频繁插入和删除操作的场景,链表的大小可以动态变化。
|
编译器 C语言
【C语言初阶】指针的运算or数组与指针的关系你了解吗?
【C语言初阶】指针的运算or数组与指针的关系你了解吗?
154 0
|
编译器 C语言
指针详细概念知识点及运用,指针与常量,指针的运算,scanf()中的&有什么用?你想知道的,都在这儿~ 1.1.4
f函数里的*p保存了i的地址,在这个函数指向i,此时对*p赋值,也就相当于对i值进行了改变,实现了对外链接,i的值变为了26,就是芥末神奇。此时以*q = 26为例,是可以做的,因为i不是const,i可以赋初值,使 i=26,但因为q是const,所以q++的做法是错误的。表示不能通过p这个指针去修改i这个变量,即*p=26是错误的,不能让 i=26,此时的*p是const。无论指向什么类型,所有指针的大小都是一样的,因为都是地址,但指向不同类型的指针是不能直接相互赋值的。......
指针详细概念知识点及运用,指针与常量,指针的运算,scanf()中的&有什么用?你想知道的,都在这儿~ 1.1.4
|
8月前
|
C语言
C语言--通过函数实现二分查找
C语言--通过函数实现二分查找
|
9月前
|
C语言
C语言---二维数组&&指针
C语言---二维数组&&指针
41 0
|
编译器 C语言 C++
C语言指针理解---一维数组作函数参数的用法
C语言指针理解---一维数组作函数参数的用法
162 1
|
9月前
|
C语言
C语言-----一维数组&&指针
C语言-----一维数组&&指针
50 0

热门文章

最新文章