pop序列可行性的判别算法

最近在学习数据结构,在浙江大学的公开课《数据结构》上有道题要求判断在给定栈大小的情况下pop序列是否可行,然后我的代码如下:

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

#define OVERFLOW -1
#define TRUE    1
#define FALSE   0

typedef struct stack{
    int *data;
    int top;
    int len;
}stk, *stk_ptr;

stk_ptr new_stk(int len);
int push(stk_ptr p, int elem);
int pop(stk_ptr p);
int **get_data(int *stk_len, int *seq_len, int *seq_num);
int check(stk_ptr stk, int* list, int len);
void set_empty(stk_ptr p);
void output(int* result, int len);

int main(){
    int stk_len, seq_len, seq_num, i;
    int *result;
    int **data;
    stk_ptr stack;
    data = get_data(&stk_len, &seq_len, &seq_num);
    stack = new_stk(stk_len);
    result = (int*)malloc(sizeof(int)*seq_num);

    for(i = 0; i < seq_num; i++){
        result[i] = check(stack, data[i], seq_len);
    }

    output(result, seq_num);

    return 0;
}

int push(stk_ptr p, int elem){
    if(p->top+1 == p->len){
        return OVERFLOW;
    } else {
        p->top += 1;
        p->data[p->top] = elem;
    }
}

int pop(stk_ptr p){
    if(p->top == -1){
        return OVERFLOW;
    } else {
        p->top -= 1;
    }
    return p->data[p->top+1];
}

stk_ptr new_stk(int len){
    stk_ptr new_stk;
    int *data;
    data = (int*)malloc(len*sizeof(int));
    new_stk = (stk_ptr)malloc(sizeof(stk));
    new_stk->data = data;
    new_stk->top = -1;
    new_stk->len = len;
    return new_stk;
}

int **get_data(int *stk_len, int *seq_len, int *seq_num){
    int i, j;
    int **data;
    scanf("%d %d %d", stk_len, seq_len, seq_num);
    data = (int**)malloc(*seq_num * sizeof(int*));
    for(i = 0; i < *seq_num; i++){
        data[i] = (int*)malloc(*seq_len*sizeof(int));
    }
    for(i = 0; i < *seq_num; i++){
        for(j = 0; j < *seq_len; j++){
            scanf("%d", data[i]+j);
        }
    }
    return data;
}

void set_empty(stk_ptr p){
    p->top = -1;
}

int check(stk_ptr stk, int* list, int len){
    int i, max, temp;
    set_empty(stk);
    max = 0;
    for(i = 0; i < len; i++){
        if(list[i] > max){
            while(list[i] > max){
                max++;
                if(OVERFLOW == push(stk, max)){
                    return FALSE;
                }
            }
            pop(stk);
        } else {
            if(list[i] != pop(stk)){
                return FALSE;
            }
        }
    }
    return TRUE;
}

void output(int* result, int len){
    int i;
    for(i = 0; i < len; i++){
        if(result[i]){
            printf("YES");
        } else {
            printf("NO");
        }
        if(i < len-1){
            printf("\n");
        }
    }
}

核心算法在check里,check函数的算法大概是这样的:

先取一个M大小的空栈

用max记录所有进过栈的数中最大的那个

对于给定的pop sequence,逐个扫描,如果它比max大那么:

     从1开始进栈,直到和当前扫描到的数一样大停止,然后把这个数pop,如果栈溢出则返回false

否则:

    从栈里pop一个数,看它是不是当前扫描到的数,不是则返回false

当前扫描的序列可行,继续扫描下一个数,知道全扫完返回true

我用题目给的sample测试结果是正确的,自己换过栈大小写了几个序列测试也能正确出结果,但是提交后系统说我全错。。。。。。
我实在查不出问题出在哪儿了

阅读 1.5k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题