• 基础实验3-2.4 出栈序列的合法性 (25分)--栈


     

     解题思路:

    先将1入栈

         判断栈顶元素和出栈序列是否一致

         栈顶元素==出栈序列,则出栈

         栈顶元素>出栈序列,顺序有误

         栈顶元素<出栈序列,按序将不大于出栈序列的数字依次入栈,如果栈满还是小于出栈序列,则入栈顺序有误

    #include <stdio.h>
    #include <malloc.h>
    #define ERROR -1
    typedef enum {false,true
                 } bool;
    typedef struct {
        int *Data;
        int Top;
        int MaxSize;
    }*Stack;
    Stack CreateStack(int size) {
        Stack S=(Stack)malloc(sizeof(Stack));
        S->Data=(int *)malloc(sizeof(int)*size);
        S->MaxSize=size;
        S->Top=-1;
        return S;
    }
    bool IsEmpty(Stack S) {
        if(S->Top==-1)
            return true;
        return false;
    }
    bool IsFull(Stack S) {
        if(S->Top==S->MaxSize-1)
            return true;
        return false;
    }
    bool Push(Stack S,int x) {
        if(IsFull(S))
            return false;
        S->Data[++S->Top]=x;
        return true;
    }
    int Pop(Stack S) {
        if(IsEmpty(S))
            return ERROR;
        return S->Data[S->Top--];
    }
    int GetTop(Stack S) {
        if(IsEmpty(S))
            return ERROR;
        return S->Data[S->Top];
    }
    int main() {
        int size,n,m;
        scanf("%d %d %d",&size,&n,&m);
        int i,x,j;
        int k=1,flag=0;
        Stack S=CreateStack(size);
        for(j=0; j<m; j++) {
            k=1;
            Push(S,k);
            k++;
            flag=0;
            for(i=0; i<n; i++) {
                scanf("%d",&x);
                if(GetTop(S)==x) {
                    Pop(S);
                } else if(GetTop(S)<x) {
                    while(k<=x) {
                        if(Push(S,k))
                            k++;
                        else {
                            flag=1;
                            break;
                        }
                    }
                    if(!flag)
                        Pop(S);
                } else {
                    flag=1;
                }
            }
            while(!IsEmpty(S)) {
                Pop(S);
            }
            if(flag)
                printf("NO
    ");
            else
                printf("YES
    ");
        }
        return 0;
    }
  • 相关阅读:
    arm单板上移植gdb
    video on web
    chromium源码阅读
    CE-HTML简介
    multi-tap
    DPDK 网卡RSS(receive side scaling)简介
    c语言实现带LRU机制的哈希表
    Linux TCP协议使用的变量
    scp源码浅析
    Linux e1000e网卡驱动
  • 原文地址:https://www.cnblogs.com/snzhong/p/12495253.html
Copyright © 2020-2023  润新知