顺序栈

顺序栈

 顺序栈是一种受到限制的顺序表,数据只能从栈顶压入,先进后出原则,遵从栈的逻辑。

构造顺序栈

 使用结构体来构造顺序栈,其中stack是用来存储数据的,size是用来指明数据的个数,top是用来指明栈顶的位置。

typedef struct seqlist_stack{

    int *stack;
    int size;
    int top;
}my_seqlist_stack,*p_seqlist_stack;

初始化

p_seqlist_stack init_list(int size)
{
    p_seqlist_stack new_list = calloc(1, sizeof(my_seqlist_stack));
    new_list->stack =  calloc(size, sizeof(int));

    new_list->size = size;
    new_list->top  = 0;

    if (NULL == new_list)
        return NULL;

    return new_list;
}

注意:
需要给结构体成员*stack分配一个空间。

压栈


int input_msg(char * msg)
{
    // 让用户输入新的数据
    int num ;
    printf("%s:" , msg);
    scanf("%d" , &num);
    while(getchar() != '
');

    return num;
}

bool push_stack(p_seqlist_stack list)
{
    if (list->top > list->size)
    {
        printf("栈满,压栈失败!!!
");
        return false;
    }   
   
   int data = input_msg("输入数据,压栈");
   list->stack[list->top++] = data;

    return true;
}

注意:
需要判断栈是否满了,满了数据会存储不下。

出栈

int pop_stack(p_seqlist_stack list)
{
    if (0 == list->top)
    {
        printf("出栈失败,栈是空的
");
        return -1;
    }

    int tmp = list->stack[list->top-1];
    list->top--;    
    
    return tmp;

}

注意:
1.需要判断栈中是否还有数据;
2.list->top需要先减1才能取数据,不然数据将错位,并且少一个。

测试程序

int test()
{
    p_seqlist_stack list = NULL;
    int size;

    list = init_list(10);
    if(NULL == list)
        return false;

    push_stack(list);
    push_stack(list);
    push_stack(list);
    push_stack(list);
    push_stack(list);

    for (int i = 0; i < 5; i++)
    {
         int data = pop_stack(list);
         printf("data:%d
", data);
    }

    return 0;
}
 
原文地址:https://www.cnblogs.com/ding-ding-light/p/14117372.html