首页 > 其他 > 详细

Pop Sequence

时间:2021-01-09 00:40:25      阅读:28      评论:0      收藏:0      [点我收藏+]

问题描述:给定一个栈,最多可存放M个元素,现要将N个数(1-N),随机入栈、出栈,入栈顺序由小到大,判断一个给定的序列是否合法。

思路:要依次判断序列中的每一个数,判定为不合法的情况有:

  1. 当前栈顶元素比该数大。因为目前处理的数还未出栈,并且一定比栈顶元素先入栈,而栈顶元素还未出栈,则该数不可能出栈成功。
  2. 在该数之前的数及该数入栈过程中栈溢出。

上述两种情况发生时直接判断不合法,其他情况:

  1. 若栈顶元素等于该数,直接出栈,继续循环。
  2. 在该数之前的数及该数入栈,该数出栈,继续循环。

代码:

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

void Judge(int M, int N);

int main() {
    int M, N, K;
    if(scanf("%d %d %d",&M,&N,&K)==3){}
    for (int i = 0;i < K;i++)
        Judge(M, N);
    return 0;
}

void Judge(int M, int N) {
    int* stack = (int*)malloc(sizeof(int) * (M+1));//用数组模拟一个栈
    int top = 0;
    int* flag = (int*)malloc(sizeof(int) * (N+1));
    int* number = (int*)malloc(sizeof(int) * (N + 1));
    memset(flag, 0, sizeof(int) * (N + 1));
    int i, j, k;
    for (i = 1;i <= N;i++) {
        if(scanf("%d",&number[i])==1){}
    }
    for (i = 1;i <= N;i++) {
        if (stack[top] > number[i]) {
            printf("NO\n");
            return;
        }
        if (stack[top] == number[i]) {
            flag[number[i]] = 2;
            top--;
            continue;
        }
        for (k = 1;k < number[i];k++) {
            if (flag[k] == 0) {
                top++;
                if (top > M) {
                    printf("NO\n");
                    return;
                }
                flag[k] = 1;
                stack[top] = k;
            }
        }
        if (top + 1 > M) {
            printf("NO\n");
            return;
        }
        flag[number[i]] = 2;
    }
    printf("YES\n");
    free(stack);
    return;
}

 

Pop Sequence

原文:https://www.cnblogs.com/yaotong0830/p/14253837.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!