数据结构-5栈

栈是一种先进后出的数据结构(属于线性表),它只允许在一端(栈顶)操作
就如弹夹装子弹

一、顺序栈

1.结构体

typedef int TypeData;

typedef struct node{
    TypeData *arr;
    int top;
    int size;
}Stack, *Pstack;

2.栈的初始化

void stack_init(Pstack *S, int len)
{
    *S = malloc(sizeof(Stack));
    if(NULL == *S){
        perror("malloc");
        return ;
    }
    (*S)->arr = malloc(sizeof(TypeData)*len);
    if(NULL == (*S)->arr){
        perror("malloc");
        return;
    }
    (*S)->top = -1;
    (*S)->size = len;
}

3.空栈

bool stack_empty(Pstack s)    //bool型,ture/false ,头文件stdbool.h
{
    if(NULL == s){
        puts("empty arg NULL");
        return false;
    }
    if(-1 == s->top)    
        return true;
    else
        return false;
}

4.满栈

{
    if(NULL == s){
        puts("full arg NULL");
        return false;
    }
    if(s->size-1 == s->top)    //eg:size=len=2;(存两个数据),top=-1;top++;top++;top=1时,存入了两个数据
        return true;
    else
        return false;
}
 

5.显示长度

int stack_len(Pstack s)
{
    if(NULL == s){
        puts("len arg NULL");
        return -1;
    }
    return s->top+1;    //长度=top+1
}

6.压栈

bool push_back(Pstack s, TypeData data)  
{                                   
    if(NULL == s){
        puts("push arg NULL");
        return false;
    }
    if(stack_full(s)){
        puts("push full");
        return false;
    }
    s->top++;         //因为s->top从-1开始,所以应该先+1
    s->arr[s->top] = data;
    return true;
}

7.出栈

bool pop_back(Pstack s, TypeData *pd)      //返回值只做函数正确或错误调用的判断
{                                     //TypeData *pd 才是真正出栈的数据
    if(NULL == s){
        puts("pop arg NULL");
        return false;
    }
    if(stack_empty(s)){
        puts("pop empty");
        return false;
    }
    *pd = s->arr[s->top--];     //出栈出arr[s->top]再top--     
    return true;
}

8.主函数

int main(int argc, char *argv[])
{ 
    Pstack s;
    stack_init(&s, 5);
    TypeData data;
    while(1){
        scanf("%d", &data);
        if(!push_back(s, data))  //如果压栈失败(栈满了),返回
            break;
    }
    printf("len:%d\n", stack_len(s));
    return 0;
} 

二、链栈

1.结构体

typedef int TypeData;
typedef struct node{
    TypeData data;
    struct node *top;    //在顶端操作
}LinkStack, *PLinkStack;

2.初始化栈

bool stack_init(PLinkStack *S)
{
    *S = malloc(sizeof(LinkStack));
    if(NULL == *S)
        return false;
    (*S)->top = NULL;
    return true;
}

3.栈空

bool stack_empty(PLinkStack s)
{
    if(NULL == s)
        return false;  
    if(NULL == s->top)
        return true;  
    else
        return false;
}

4.出栈

bool stack_pop(PLinkStack s, TypeData *data)
{
    
    if(stack_empty(s) || NULL == s)
        return false;
    *data = s->top->data;
    PLinkStack p = s->top;
    s->top = p->top;   //s->top = s->top->top
    free(p);
    return true;
    清除栈就是循环的出栈,直到栈空
}

5.压栈

bool stack_push(PLinkStack s, TypeData data)
{
    if(NULL == s)
        return false;
    PLinkStack p = malloc(sizeof(LinkStack));
    if(NULL == p)
        return false;
    p->data = data;
    p->top = s->top;
    s->top = p;
    return true;
}

6.清除栈

bool stack_clear(PLinkStack s)
{
    if(NULL == s || stack_empty(s))
        return false;
    PLinkStack p;
    while(NULL != s->top){  //while(s->top)
        p = s->top;
        s->top = p->top; //s->top = s->top->top;
        free(p);
    }
    return true;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值