02-线性结构4. Pop Sequence(25)

pat-mooc-02-4

题目的意思:
栈的大小M,输入序列的长度N(默认序列即为1,2,3…,N),入栈出栈的顺序不定。有K个测试序列,判断每一个测试序列是否是可能的出栈顺序。
核心:从出栈顺序推测入栈顺序

关键点:当看到pop t时,那么一定要先push 1,2,3…t-1,t,即要先将小于等于**t的数都push入栈才能pop t。这个过程中检查**pop的次数是否等于N以及入栈的数目是否大于栈的容量M

#include<stack>
#include<iostream>
#include<vector>
#include<iterator>
#include<algorithm>

using namespace std;
int M,N,K;
int check_stack(vector<int> &v){
    stack<int> sta;
    sta.push(0);    //dummy element, as sential
    int cap = M + 1;    //stack capacity
    int idx = 0;        //index of vector v
    int num = 1;        //to push to stack
    while(idx != N){
        while(v[idx]>sta.top()&&sta.size()<cap&&idx<=N)
            sta.push(num++);        
        if(v[idx]==sta.top()){
            sta.pop();
            idx++;
        }
        else //sta.size>=cap; idx>N
            return 0;   //false
    }
    return 1;   //true
}
int main(){
    //int M,N,K;
    cin>>M>>N>>K;
    vector<int> vec(N,0);   //N pop number
    for(int i = 0; i!=K; ++i){
        //input to vec
        copy_n(istream_iterator<int>(cin),N,vec.begin());
        cout << (check_stack(vec)?"YES":"NO")<<endl;
    }   
}

这里写图片描述
语言技巧
copy_n(istream_iterator(cin),N,vec.begin());

当然也可以自己用c,写一下栈的操作,速度上会快不少

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

#define MaxSize 1000
//Stack implement with array
typedef struct node{
        int Data[MaxSize];
        int cap;
        int top;        //size = top+1
}Stack;

int M,N,K;
Stack *CreateStack(){
        Stack *PtrS = (Stack*)malloc(sizeof(struct node));
        PtrS->cap = MaxSize;
        PtrS->top = -1;
        return PtrS;
}

void Push(Stack *PtrS, int ele){
        if(PtrS->top == PtrS->cap-1){
                printf("FULL");
                return;
        }
        PtrS->top++;
        PtrS->Data[PtrS->top]=ele;
}

int top(Stack *PtrS){
        return PtrS->Data[PtrS->top];
}

void Pop(Stack *PtrS){
        if(PtrS->top==-1){
                printf("Empty");
                return;
        }
        PtrS->top--;
}

int check_stack(int v[]){
        int new_cap = M+1;
        Stack *ps = CreateStack();
        Push(ps,0);     //dummy element
        int idx = 0;    //index of v
        int num=1;      //to put to stack
        while(idx!=N){
                while(top(ps)<v[idx]&&idx!=N&&(ps->top+1)<new_cap)
                        Push(ps,num++);
                if(top(ps)==v[idx]){
                        Pop(ps);
                        idx++;
                }
                else
                        return 0;       //false
        }
        return 1;

}

int main(){
        //输入
        scanf("%d %d %d",&M,&N,&K);
        int *v = (int *)malloc(sizeof(int)*N);
        int i;
        for(;K!=0;--K){
                for(i = 0; i!= N; ++i)
                        scanf("%d",v+i);
                if(check_stack(v))
                        printf("YES\n");
                else
                        printf("NO\n");
        }
        return 0;
}

这里写图片描述

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/whzyb1991/article/details/46663867
个人分类: PAT-MOOC-DS
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭