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

Code

#include<stdio.h>
#include<stdlib.h>
#define Maxsize 1000

//堆栈是我自己建的[1,2,3,4,5]
typedef struct SNode{
    int Capacity;
    int Top;    //用来指向栈顶元素的下标
    int Data[Maxsize];
}*Stack;

int RetendTop(Stack S){
    if(S->Top>=0){
        return S->Data[S->Top];
    }
    else{
        return -1;
    }
}

void Pop(Stack S){
    S->Top--;
}

int Push(Stack S,int x){    //入栈,成功返回1,溢出返回0
    if(S->Capacity==S->Top+1){
        return 0;   //判断栈是否已满
    }
    else{
        S->Data[++S->Top] = x; //++s->Top 先自增1在赋值
        return 1;
    }
}

Stack CreateStack(int M){
    Stack S = (Stack)malloc(sizeof(struct SNode));
    S->Top = -1;
    S->Capacity = M;
    return S;
    }

int IsPopPossible(int Test[],int M,int N){//judge if it is Pop sequeces
   Stack S = CreateStack(M);
   int head = 0;//
   for (int i = 1;i<=N;i++){
       if(!Push(S,i)){     //push in Pop ,判断是否溢出
           return 0;
       }
        while(RetendTop(S)==Test[head]){//judge if Top and [] equal 
            Pop(S);
            head++;
        }
   }
        if(head == N){//出栈元素数和用例元素数相等
            return 1;
        }
        else{
            return 0;
        }
   
}

int main(){
    int M,N,K;  //栈最大容量M;进栈序列长度N;被检查出栈序列个数K
    scanf("%d %d %d",&M,&N,&K);
    int Test[N]; //出栈测试用例
    for (int i =0;i<K;i++){

        for(int j =0;j<N;j++){      //循环读取每一条出栈序列的元素并判断
           scanf("%d",&Test[j]);
        }
        if(IsPopPossible(Test,M,N)){ //数组参数传递不需要[]
            printf("YES\n");
        }
        else{
            printf("NO\n");
        }
    }
    
    return 0;

}

草稿

输入是 575;
M(栈最大容量)限制了进栈序列
5
N限制了出栈序列的大小
7
K限制了测试用例的多少
5
数据结构:
结构体数组
链表

程序框架:
pop()
push()
IfPopPossiable()

top()
CreatStack()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值