基于链表实现栈

本文介绍了一种基于链表实现的栈结构——链式栈,并通过代码详细展示了其初始化、销毁、创建节点、入栈、出栈及取栈顶元素等核心功能。通过测试案例演示了链式栈的操作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在上一篇博客中,我们介绍了栈的概念、特点,也用代码实现了顺序栈。在这篇博客中,我们将基于链表来实现栈,即链式栈。

linkstack.h:

#pragma once

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

typedef char LinkStackType;

typedef struct LinkStack{
    struct LinkStack* next;
    LinkStackType data;
}LinkStack;

void LinkStackInit(LinkStack** phead);//初始化
void LinkStackDestroy(LinkStack** phead);//销毁
LinkStack* CreateNode(LinkStackType value);//创建新节点
void LinkStackPush(LinkStack** phead,LinkStackType value);//入栈
void LinkStackPop(LinkStack** phead);//出栈
int GetTop(LinkStack* head,LinkStackType* value);//取栈顶元素
void LinkStackPrint(LinkStack* head,const char* msg);//打印函数
linkstack.c:

#include "linkstack.h"

void LinkStackInit(LinkStack** phead){
    if(phead == NULL){
        return;
    }
    *phead = NULL;
}

void LinkStackDestroy(LinkStack** phead){
    if(phead == NULL){
        return;
    }
    LinkStack* cur = *phead;
    for(;cur != NULL;cur = cur->next){
        free(cur);
    }
    *phead = NULL;
}

LinkStack* CreateNode(LinkStackType value){
    LinkStack* new_node = (LinkStack*)malloc(sizeof(LinkStack));
    new_node->data = value;                           
    new_node->next = NULL;
    return new_node;
}

void LinkStackPrint(LinkStack* head,const char* msg){
    printf("[%s]\n",msg);
    LinkStack* cur = head;
    for(;cur != NULL;cur = cur->next){
        printf("[%c] ",cur->data);
    }
    printf("\n");
}

void LinkStackPush(LinkStack** phead,LinkStackType value){
    if(phead == NULL){
        return;
    }
    LinkStack* new_node = CreateNode(value);
    new_node->next = *phead;
    *phead = new_node;
}  

void LinkStackPop(LinkStack** phead){
    if(phead == NULL){
        return;
    }
    if(*phead == NULL){
        return;
    }
    LinkStack* to_delete = *phead;
    *phead = (*phead)->next;
    free(to_delete);
}

int GetTop(LinkStack* head,LinkStackType* value){
    if(head == NULL){
        return 0;
    }
    *value = head->data;
    return 1;
}
test.c:

#include "linkstack.h"

#define PRINT_HEADER printf("\n============%s============\n",__FUNCTION__)

void test(){
    PRINT_HEADER;                                                                        
    LinkStack* stack;
    LinkStackInit(&stack);
    LinkStackPrint(stack,"顺序栈的初始化");

    LinkStackPush(&stack,'a');
    LinkStackPush(&stack,'b');
    LinkStackPush(&stack,'c');
    LinkStackPush(&stack,'d');
    LinkStackPrint(stack,"入栈四个元素");
            
    LinkStackPop(&stack);
    LinkStackPrint(stack,"出栈一个元素");
    LinkStackPop(&stack);
    LinkStackPrint(stack,"出栈两个元素");
    LinkStackPop(&stack);
    LinkStackPrint(stack,"出栈三个元素");
    LinkStackPop(&stack);
    LinkStackPrint(stack,"出栈四个元素");
    LinkStackPop(&stack);
    LinkStackPrint(stack,"尝试对空栈进行出栈操作");
                              
    LinkStackPush(&stack,'a');
    LinkStackPush(&stack,'b');
    LinkStackPush(&stack,'c');
    LinkStackPush(&stack,'d');
    LinkStackPrint(stack,"入栈四个元素");

     LinkStackType value;
     int ret=GetTop(stack,&value);
     printf("top except d,actual %c\n",value);
 
     LinkStackDestroy(&stack);
     LinkStackPrint(stack,"销毁栈"); 
  }
 
int main(){
    test(); 
 } 

结果演示:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值