文章目录

  • 前言
  • 一、链栈的定义
  • 二、链栈的结构
  • 三、链栈的常用操作
  • 结语
  • 附录

前言

前面完成了栈结构中顺序栈的学习,下面开始对栈结构中的链栈进行学习。

一、链栈的定义

栈是限定仅在表尾进行插人或删除操作的线性表。因此,对栈来说,表尾端有其特殊含义,称为栈顶,相应地,表头端称为栈底。不含元素的空表称为空栈。栈的修改是按后进先出的原则进行的,因此栈又称为后进先出的线性表,简称LIFO结构。而链栈就是使用链式结构来实现栈,链栈的空间可以是不连续分配。

二、链栈的结构

结构图


代码描述

#define ElemType int   //结点内数据类型//链栈的结点
typedef struct StackNode
{ElemType data;          //数据域struct StackNode *next; //指针域
}StackNode;typedef StackNode* LinkStack; //链栈指针

三、链栈的常用操作

初始化

//初始化栈
void InitStack(LinkStack *s)
{*s = NULL;
}

入栈

//入栈
void Push(LinkStack *s, ElemType x)
{//为栈结点分配空间StackNode *t = (StackNode*)malloc(sizeof(StackNode));assert(t != NULL);//将数据存入这个栈结点t->data = x;if(*s == NULL) //如果链栈里面的结点为空{*s = t;         //将链栈的指针指向这个结点t->next = NULL;}else  //如果栈里面已经有结点,直接进行头插{t->next = *s;//将新结点连接上之前的结点*s = t;//将栈指针指向最新的栈结点}
}

显示栈内数据

//显示链栈内的所以元素
void Show(LinkStack *s)
{StackNode *p = *s;//指向栈顶while(p != NULL)//向下搜索栈结点,如果找到则将其数据输出{printf("%d\n",p->data);p = p->next;}printf("\n");
}

出栈

//出栈(头删)
void Pop(LinkStack *s)
{StackNode *p = *s;//指向新的栈顶*s = p->next;//删除结点free(p);p = NULL;
}

判断栈是否为空

//判断栈是否为空
bool IsEmpty(LinkStack *s)
{//如果栈顶top的值等于0,则表示栈为空if(*s==NULL)return true;elsereturn false;
}

获取栈顶元素

//获取栈顶元素
bool GetTop(LinkStack *s, ElemType *v)
{//如果栈为空,则获取不了栈顶元素if(IsEmpty(s)){    printf("栈空间已空,不能取栈顶元素.\n");return false;}//获取栈顶元素*v = (*s)->data;return true;
}

获取栈内元素个数

//获取栈内元素的个数
int Length(LinkStack *s)
{int len=0;StackNode *p = *s;while(p!=NULL){//不断下移查找元素个数p=p->next;  len++;}return len;
}

清空栈

//清空栈
void Clear(LinkStack *s)
{while(*s!=NULL){//只要栈内还有元素就出栈Pop(s);}
}

销毁栈

//销毁栈
void Destroy(LinkStack *s)
{//此处链栈当将栈清空,相当于销毁Clear(s);
}

结语

对链栈的介绍就到这里,希望这篇文章能够给努力学习的你一些帮助。

附录

以下提供链栈的测试代码

LinkStack.h

#ifndef __LINKSTACK_H__
#define __LINKSTACK_H__#include<stdio.h>
#include<malloc.h>
#include<assert.h>#define ElemType int   //结点内数据类型//链栈的结点
typedef struct StackNode
{ElemType data;          //数据域struct StackNode *next; //指针域
}StackNode;typedef StackNode* LinkStack; //链栈指针void InitStack(LinkStack *s);
void Push(LinkStack *s, ElemType x);
void Show(LinkStack *s);
void Pop(LinkStack *s);
bool IsEmpty(LinkStack *s);
bool GetTop(LinkStack *s, ElemType *v);
int Length(LinkStack *s);
void Clear(LinkStack *s);
void Destroy(LinkStack *s);#endif //__LINKSTACK_H__

LinkStack.cpp

#include"LinkStack.h"//初始化栈
void InitStack(LinkStack *s)
{*s = NULL;
}//入栈
void Push(LinkStack *s, ElemType x)
{//为栈结点分配空间StackNode *t = (StackNode*)malloc(sizeof(StackNode));assert(t != NULL);//将数据存入这个栈结点t->data = x;if(*s == NULL) //如果链栈里面的结点为空{*s = t;         //将链栈的指针指向这个结点t->next = NULL;}else  //如果栈里面已经有结点,直接进行头插{t->next = *s;//将新结点连接上之前的结点*s = t;//将栈指针指向最新的栈结点}
}
//显示链栈内的所以元素
void Show(LinkStack *s)
{StackNode *p = *s;//指向栈顶while(p != NULL)//向下搜索栈结点,如果找到则将其数据输出{printf("%d\n",p->data);p = p->next;}printf("\n");
}//出栈(头删)
void Pop(LinkStack *s)
{StackNode *p = *s;//指向新的栈顶*s = p->next;//删除结点free(p);p = NULL;
}//判断栈是否为空
bool IsEmpty(LinkStack *s)
{//如果栈顶top的值等于0,则表示栈为空if(*s==NULL)return true;elsereturn false;
}//获取栈顶元素
bool GetTop(LinkStack *s, ElemType *v)
{//如果栈为空,则获取不了栈顶元素if(IsEmpty(s)){    printf("栈空间已空,不能取栈顶元素.\n");return false;}//获取栈顶元素*v = (*s)->data;return true;
}//获取栈内元素的个数
int Length(LinkStack *s)
{int len=0;StackNode *p = *s;while(p!=NULL){//不断下移查找元素个数p=p->next;  len++;}return len;
}//清空栈
void Clear(LinkStack *s)
{while(*s!=NULL){//只要栈内还有元素就出栈Pop(s);}
}//销毁栈
void Destroy(LinkStack *s)
{//此处链栈当将栈清空,相当于销毁Clear(s);
}

Main.cpp

#include"LinkStack.h"void main()
{LinkStack st;InitStack(&st);for(int i=1; i<=5; ++i){Push(&st,i);}Show(&st);printf("栈长度:%d\n",Length(&st));ElemType v;if(GetTop(&st, &v))printf("栈顶元素:%d\n\n",v);Pop(&st);Show(&st);Clear(&st);if(IsEmpty(&st))printf("true\n");else printf("false\n");Destroy(&st);}

栈结构之链栈详解(C语言版)相关推荐

  1. 数据结构殷人昆电子版百度云资源_数据结构精讲与习题详解(C语言版第2版清华大学计算机系列教材)...

    导语 内容提要 殷人昆编著的<数据结构精讲与习题详解(C语言版第2版清华大学计算机系列教材)>是清华大学出版社出版的<数据结构(C语言版)>(第2版)的配套教材,对" ...

  2. c语言 一个函数返回结构体指针,详解C语言结构体中的函数指针

    结构体是由一系列具有相同类型或不同类型的数据构成的数据集合.所以,标准C中的结构体是不允许包含成员函数的,当然C++中的结构体对此进行了扩展.那么,我们在C语言的结构体中,只能通过定义函数指针的方式, ...

  3. 【八大排序详解~C语言版】直接插入排序-希尔排序- 直接选择排序-堆排序-冒泡排序-快速排序-归并排序-计数排序

    八大排序 1.直接插入排序 2.希尔排序 3.直接选择排序 直接选择排序改进 4.堆排序 1.建堆 2.利用堆删除思想来进行排序 5.冒泡排序 6.快速排序 递归实现 非递归实现 7.归并排序 递归实 ...

  4. Java堆和栈的区别/联系详解

    Java堆和栈的区别/联系详解 关于Java中堆栈内存的知识,算是基础知识,和C语言中的指针有一些类似,面试中也经常会被问到,特别是跟Java和C都有关的开发工作. 一.堆栈的联系 在Java中,内存 ...

  5. 栈帧ebp,esp详解

    栈帧%ebp,%esp详解 分类专栏: 汇编 首先应该明白,栈是从高地址向低地址延伸的.每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息.寄存器ebp指向当前的栈帧的底部 ...

  6. 【数据结构】共享栈详解 判断共享栈满条件栈顶指针变化详解记忆方法例题

    摘要:简单易懂,详细地介绍共享栈概念,指针,判断共享栈栈满条件以及记忆方法等 目录 共享栈概念 栈顶指针&变化详解 栈顶指针种类的记忆方法 判断栈满条件 判断栈满条件的记忆方法 例题 解题思路 ...

  7. c语言 字符串 strncpy,详解c语言中的 strcpy和strncpy字符串函数使用

    详解c语言中的 strcpy和strncpy字符串函数使用 strcpy 和strcnpy函数--字符串复制函数. 1.strcpy函数 函数原型:char *strcpy(char *dst,cha ...

  8. DBus glib 各数据类型接收与发送详解—C语言(3)

    DBus glib 各数据类型接收与发送详解-C语言(3) 动机 前置知识 正文 Python 测试服务 使用 C 实现复杂数据类型的传递 DICT_DICT ObjectPath_Dict_Stru ...

  9. 详解go语言的array和slice 【二】

    上一篇  详解go语言的array和slice [一]已经讲解过,array和slice的一些基本用法,使用array和slice时需要注意的地方,特别是slice需要注意的地方比较多.上一篇的最后讲 ...

最新文章

  1. 设计模式 抽象工厂模式(Abstract Factory)
  2. java命令行参数工具_Java方法中的参数太多,第8部分:工具
  3. php 安全mysql,关于php:我从mysql注入安全吗?
  4. 疫苗:JAVA HASHMAP的死循环
  5. 流程控制语句反汇编(1)(Debug版)
  6. 瑞友天翼提示mysql error_瑞友天翼加载应用程序出错解决方法
  7. 神经网络入门-感知器算法
  8. 模型加速(矩阵元素优化和cuba使用)
  9. vue.jsv-html,Vue.js-资料-组件化思想 —下
  10. ssh连接远程服务器报错:ssh_exchange_identification: read: Connection reset by peer
  11. 玩转软路由 篇二:软路由中Esxi 7.0 安装教程和避坑指南
  12. anaconda3配置python2.7环境_Anaconda3+python3环境下如何创建python2环境(win+Linux下适用,同一个anaconda下py2/3共存)...
  13. CC2530驱动_ds18b20
  14. Oracle安装和配置
  15. Windows10系统提速优化
  16. c语言输出2~100以内所有的素数
  17. 商务手机最大突破是打破墨守成规的工作方式
  18. python对文件的操作都有什么_python中文件操作的相关内容总结(附示例)
  19. 使用Eclipse和BlackBerry JDE开发黑莓应用程序
  20. 数据科学与大数据技术专业有哪些就业方向?

热门文章

  1. war包放入tomcat中无法自动解压
  2. 利用Go语言上传图像并生成缩略图
  3. 提交按钮css加样式,用CSS美化按钮(button)
  4. 前端无法反序列化START\u数组标记-JSONCannot deserialize instance of `java.lang.String` out of START_ARRAY toke
  5. SpringAOP原理+使用
  6. 怎样更换计算机开机画面,如何给win10电脑更换一个漂亮的开机界面
  7. 1024 程序员节城市嘉年华,共话技术生涯的一万种可能!
  8. 洛谷 P1747 好奇怪的游戏
  9. HTML <b> 标签
  10. MDK-keil安装与使用