数据结构与算法----栈

数据结构与算法----栈

简单来说,栈就相当于与有一堆扑克牌,只能在最顶上放牌,也只能在最顶上拿牌

所以说栈的操作实际上是对最顶端数据的操作

在这里插入图片描述

实现栈操作可以使用顺序表,也可以使用链表

顺序表

我们需要一个额外的变量来记录栈顶的位置,这样才能更加方便的进行操作

初始化栈

struct Stack{
    int * array; //数组
    int capacity; //容量
    int top; //栈顶索引
};

void InitStack(struct Stack* stack){
    stack->array = (int*)malloc(sizeof(int) * 10); //初始时分配内存
    if(stack->array == NULL) return 0; //分配失败结束
    stack->capacity = 10;
    stack->top = -1; //默认初始时栈顶为-1
}

插入元素

void Insertstack(struct Stack* stack , int element){ //不需要输入索引值,因为只会对栈顶操作
    if(stack->top + 1 == stack->capacity){ //如果栈已经满了,重新分配内存
        int* NewArray = (int*)realloc(stack->array , sizeof(int)*(stack->capacity + 10));
        if(NewArray == NULL) return 0;
        stack->array = NewArray;
        stack->capacity = stack->capacity + 10;
    }
    stack->array[stack->top + 1] = element; //存入元素
    stack->top++; //栈顶自增
}

删除元素

void Deletestack(struct Stack* stack){
    if(stack->top == -1) return 0; //如果元素已经没了,那么直接返回
    stack->top--; //直接让栈顶索引减1就好了
}

打印栈

void Printstack(struct Stack* stack){
    for(int temp = 0 ; temp <= stack->top ; temp++){
        printf("%d  ",stack->array[temp]);
    }
    printf("\n");
}

链表

在这里插入图片描述
在这里插入图片描述

初始化栈

struct StackNode{
    int element;
    struct StackNode* next;
};

void InitStack(struct StackNode* head){
    head->next = NULL; //默认下一结点为空
}

插入元素

void InsertStack(struct StackNode* head , int element){
    struct StackNode* temp = (struct StackNode*)malloc(sizeof(struct StackNode));
    if(temp == NULL) return 0;
    struct StackNode* remem = head->next ;
    head->next = temp;
    temp->element = element;
    temp->next = remem;
}

删除元素

void DeleteStack(struct StackNode* head){
    struct StackNode* temp = head->next;
    head->next = head->next->next;
    free(temp);
}

打印栈

void PrintStack(struct StackNode* head){
    while(head->next != NULL){
        printf("%d  ",head->next->element);
        head = head->next;
    }
    printf("\n");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yyym__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值