数据结构-栈-散装C语言

数据结构 考研复试 突击

数据结构 备考第二天😂

关于栈

  1. 先进后出
  2. 常用于 验证 符号成对出现

概述

  1. 初始化栈,分配一个stack地址空间,stack指针指向一个空地址。
    初始栈
  2. 压栈,stack的next指针指向栈顶元素,可以理解为链表的头插法。
    压栈
  3. 出栈,弹出的也是栈顶元素,
    出栈

附上代码

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

typedef int Data;
typedef struct Node
{
    Data data; // 整形数据元素
    struct Node *next; // 下一指针域
}Stack;

Stack* init_stack() // 初始化栈
{
    Stack *stack = (Stack*)malloc(sizeof(Stack));  
    if(stack != NULL)
    {
        stack->next = NULL; // 头节点 指向 空指针
        return stack;
    }
    printf("无法分配内存!");
    return NULL;
}

int is_empty(Stack *stack) // 判空
{
    return stack->next == NULL; // 栈底指针 为空,即栈为空
}

// 入栈
// 1 压栈 成功
// 0 压栈 失败
int push_stack(Stack *stack, Data data) 
{
    Stack *push = (Stack*)malloc(sizeof(Stack));
    if(push != NULL)
    {
        push->data = data;
        push->next = stack->next; // 新节点 插入至 栈顶
        stack->next = push; // stack 指向 栈顶
        return 1;
    }
    printf("无法分配内存\n");
    return 0;
}

// 出栈
// 1 出栈 成功
// 0 出栈 失败
int pop_stack(Stack *stack)
{
    Stack *temp; // 指向 待弹出
    if(!is_empty(stack))
    {
        temp = stack->next; // temp为栈顶 元素
        stack->next = temp->next; // stack指针 指向 temp的下一节点
        free(temp); // 释放 栈顶元素
        temp = NULL; // 防止 野指针
        return 1;
    }
    else
    {
        return 0;
    }
    
}


// 取栈顶元素的值
void get_pop_elem(Stack *stack)
{
    if(!is_empty(stack))
    {
        printf("%d ", stack->next->data);
    }
    else{
        printf("栈为空");
    }
} 

// 清空栈
void empty_stack(Stack *stack) 
{
    while(!is_empty(stack)) 
    {
        pop_stack(stack);
    }
    printf("完成清空栈\n");
}

void destory_stack(Stack *stack) // 销毁栈
{
    free(stack);
    stack = NULL;
    printf("栈已被销毁\n");
}

// 显示栈的所有 元素
void show_stack(Stack *stack)
{
    Stack *temp = stack; // 辅助 指针
    while (!is_empty(temp)) // 判断下个 节点 是否为空
    {
        temp = temp->next;
        printf("%d ", temp->data);
    }
    printf("\n");
}


int main() // 主函数
{
    // 初始化 栈
    Stack *stack = init_stack();

    // 入栈
    push_stack(stack, 1);
    push_stack(stack, 2);
    push_stack(stack, 3);
    push_stack(stack, 4);
    push_stack(stack, 5);
    show_stack(stack);

    // 出栈
    pop_stack(stack);
    pop_stack(stack);
    show_stack(stack);

    //获取栈顶元素
    get_pop_elem(stack);

    // 清空栈
    empty_stack(stack);

    // 销毁栈
    destory_stack(stack);

    getchar();
    return 0;
}

欢迎小伙伴们 评论😃

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值