当前位置: 首页 > news >正文

[数据结构]#4 用链表实现的栈结构

使用链表来实现栈是一种比较常见的做法,它能够有效利用链表的动态特性来支持栈的一些基本操作,例如:

1.Push(入栈):向栈中添加一个元素。

2.Pop(出栈):从栈中移除顶部的元素。

3.Peek/Top(查看栈顶元素):返回栈顶元素但不将其移除。

4.IsEmpty(判断栈是否为空):检查栈中是否有元素。

我们再来回忆一下链表,它由一系列节点组成,每个节点包含两部分:数据域和指针域(指向下一个节点)。对于单向链表来说,每个节点只有一个指向后续节点的链接。在链表的头部(head)是开始访问链表的入口点,在实现栈时,我们通常将链表头视为栈顶。

基于链表的代码结构,我们可以搭出这套用法的框架:

//linkstack.h文件#ifndef _LINKSTACK_H_
#define _LINKSTACK_H_typedef struct
{char name[32];char sex;int age;int score;
} DATATYPE;typedef struct stacknode
{DATATYPE data;struct stacknode* next;
} LinkStackNode;typedef struct
{LinkStackNode* top;int clen;
} LinkStack;LinkStack* CreateLinkStack();
int DestroyLinkStack(LinkStack* ls);
int PushLinkStack(LinkStack* ls, DATATYPE* data);
int PopLinkStack(LinkStack* ls);
int IsEmpytLinkStack(LinkStack* ls);
DATATYPE* GetTopLinkStack(LinkStack* ls);
int GetSizeLinkStack(LinkStack* ls);
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>//创建栈链表
LinkStack* CreateLinkStack()
{LinkStack* ls = malloc(sizeof(LinkStack));if (NULL == ls){fprintf(stderr, "CreateLinkStack malloc error\n");return NULL;}ls->top = NULL;ls->clen = 0;return ls;
}int GetSizeLinkStack(LinkStack* ls)
{return ls->clen;
}//获取栈顶数据
DATATYPE* GetTopLinkStack(LinkStack* ls)
{if (IsEmpytLinkStack(ls)){return NULL;}return &ls->top->data;
}//是否为空
int IsEmpytLinkStack(LinkStack* ls)
{return 0 == ls->clen;
}//释放内存
int DestroyLinkStack(LinkStack* ls)
{int size = GetSizeLinkStack(ls);for (int i = 0; i < size; i++){PopLinkStack(ls);}free(ls);return 0;
}

入栈、出栈:

//入栈
int PushLinkStack(LinkStack* ls, DATATYPE* data)
{LinkStackNode* newnode = malloc(sizeof(LinkStackNode));if (NULL == newnode){fprintf(stderr, "PushLinkStack  malloc error\n");return 1;}memcpy(&newnode->data, data, sizeof(DATATYPE));newnode->next = NULL;if (IsEmpytLinkStack(ls)){ls->top = newnode;}else{newnode->next = ls->top;ls->top = newnode;}ls->clen++;return 0;
}//出栈
int PopLinkStack(LinkStack* ls)  // head del
{if (IsEmpytLinkStack(ls)){return 1;}LinkStackNode* tmp = ls->top;ls->top = ls->top->next;free(tmp);ls->clen--;return 0;
}

http://www.dtcms.com/a/291173.html

相关文章:

  • FastAPI 中,数据库模型(通常使用 SQLAlchemy 定义)和接口模型(使用 Pydantic 定义的 schemas)的差异
  • GraphRAG快速入门和原理理解
  • 在线教育如何设置视频问答/视频弹题?——重塑在线教育的互动体验
  • 元宇宙工厂漫游指南:VR可视化在设备巡检与远程运维中的沉浸式应用
  • Component cannot be used as a JSX component
  • 网络数据编码技术及其应用场景的全面解析
  • 基于Vue与CloudBase AI Toolkit的色觉识别Web应用开发报告:VibeCoding新范式实践
  • 基于dcmtk的dicom工具 第八章 echoSCU-dicom测试连接
  • 广东餐饮服务中级水平测试精选题库
  • 基于Python的多传感器融合的障碍物检测与避障演示
  • WPF 项目设置应用程序图标和设置程序集图标
  • 搭建种草商城框架指南
  • 修复WSL安装失败(错误: 0x80248014 )并安装K8S
  • 低空经济展 | 约克科技携小型化测试设备亮相2025深圳eVTOL展
  • Linux物理地址空间入门:从硬件到内核内存的基石
  • Javascript--事件
  • 耐达讯RS232转Ethercat网关:建筑驱动连接的“秘密武器”
  • 【系统全面】Socket编程——基础知识介绍
  • 2x2矩阵教程
  • AI赋能中医传承:智慧医疗新时代解决方案
  • 如何避免redis分布式锁失效
  • 搭建前端页面,介绍对应标签
  • 前端之学习后端java小白(一)之SDKMAN
  • Typecho目录树插件开发:从后端解析到前端渲染全流程
  • AI革命带来的便利
  • [特殊字符] Java反射从入门到飞升:手撕类结构,动态解析一切![特殊字符]
  • 多线程--线程池
  • 【docker】分享一个好用的docker镜像国内站点
  • dev tools的使用
  • FastMCP全篇教程以及解决400 Bad Request和session termination的问题