目录

  • 一.栈的定义
  • 二.栈的特点
  • 三.栈的理解
  • 四.链栈引入
  • 五.链栈定义
  • 六.链栈的结构体设计
  • 七.链栈的基本操作
    • 7.1链栈的初始化
    • 7.2链栈判空
    • 7.3链栈入栈
    • 7.4链栈出栈
    • 7.4取栈顶元素
  • 八.总结

一.栈的定义

栈是限定仅在表尾进行插入和删除操作的数据结构(受到限制的线性表)。
我们把允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何元素为空栈。

二.栈的特点

后进先出

比如word,浏览器网页等一系列软件中,都有撤销的操作,就是利用栈的这种方式来实现的,可能不同软件的代码不同,但是他们的原理是一样的均为:后进先出。

三.栈的理解

  1. 栈是一个线性表,有前驱后继关系,只不过这里的表尾指的是栈顶。
  2. 栈限制了线性表的插入和删除位置,这也导致栈底是固定的。
  3. 栈的插入操作,叫做进栈;可以理解为子弹入弹夹。
  4. 栈的删除操作,叫做出栈;可以理解为子弹出弹夹。

四.链栈引入

既然栈是属于线性表的一种,那么存储结构也就分为顺序存储和链式存储,这里我们着重讲解链式存储结构。

五.链栈定义

栈的链式存储结构,简称链栈。

对于栈来说,只在栈顶做插入和删除操作,由于单链表有头指针,栈顶指针也是必须的,那我们干脆就将头指针和栈顶指针合二为一,将栈顶放在单链表的头部。通常对于链栈是不需要头结点的

对于链栈来说,一般不会存在栈满的情况,如果这种事情真的发生,那么此时的计算机操作系统也将会面临死机崩溃的情况,那就不单单是这个链栈是否溢出的问题了。对于链表来说,链表为空的表示是头结点指向空,那么对于链栈来讲,链栈为空就是栈顶指针指向空(top = NULL)。

六.链栈的结构体设计

代码如下:

// 链栈的存储结构
typedef struct StackNode
{int data;struct StackNode *next;
}StackNode,*LinkStack;

七.链栈的基本操作

对于链栈来说作为线性表的一种,操作也就那么几种,这里我们对以下几种操作进行详解:初始化,判断是否为空,入栈,出栈,取栈顶元素等。

7.1链栈的初始化

链栈的初始化可以理解为构造一个空栈,将栈顶指针top所指头结点的指针域置为NULL,因为此时栈中还没有数据元素。
代码如下:

LinkedStack Init_LinkedStack()
{LinkedStack top = (LinkedStackNode *)malloc(sizeof(LinkedStackNode));  //栈顶指针变量if(top != NULL){top->next = NULL;}return top;
}

7.2链栈判空

判断链栈是否为空,只需要判断栈顶的指针域是否指向空,如果指向空则栈空,相反亦然。


bool LinkedStack_Empty(LinkedStack top)
{if(top->next == NULL)//如果栈顶的指针域指向空,则栈空{return True;}else{return False;}

7.3链栈入栈

入栈就是:

  1. 先对数据域进行赋值;
  2. 然后让新结点指向栈顶指针;
  3. 最后将栈顶指针交给新节点。

假设元素值为e的新节点是s,top为栈顶指针:

代码如下:


int Push(LinkedStack *s  ,elemtype e)
{LinkedStackNode s= (LinkedStackNode )malloc(sizeof(LinkedStackNode));s->data=e;s->next=s->top;//把当前的栈顶元素赋值给新结点的直接后继.s->top=s;//把新节点s赋值给栈顶指针s->cout++;return 1;
}

7.4链栈出栈

出栈就是:

  1. 将要删除的元素的值交给临时变量,将栈顶指针交给临时节点;
  2. 将栈顶指针下移;
  3. 最后释放临时节点(即完成删除)。

假设变量p用来存储要删除的栈顶结点,将栈顶指针向下移一位,最后释放p即可:

代码如下:

int Pop_LinkedStack(LinkedStack *s,elemtype *e)
{LinkedStackNode *p;if(stackempty(*s))return error;*e=s->top->data;p=s->top;   //将栈顶结点赋值给ps->top=s->top->next;//使得栈顶结点指针下移一位,指向后一结点free(p);//释放结点s->count--; return 1;}
}

7.4取栈顶元素

读取栈顶元素,并返回其值,该操作与出栈的区别是栈顶元素并不删除,所以不用修改头结点的指针域即可。

int Get_LinkedStack(LinkedStack top,elemtype *x)
{if(top->next == NULL){return 0;}else{*x = top->next->data;return 1;}
}

八.总结

对比顺序栈和链栈,如果栈的使用过程中元素变化不可预料,有时小,有时大,那么最好用链栈;反之,如果他的变化在可控范围之内建议使用顺序栈会更好点。

(小白一位,如有错误欢迎指正)

数据结构 栈-链栈及基本操作相关推荐

  1. 停车场管理系统(C语言顺序栈+链栈+链队列)

    一.实验目的 1.根据停车场管理系统的要求,利用结构化程序设计方法以及C的编程思想来完成系统的设计,使用数据结构中的栈.队列进行分析: 2.按功能定义函数或书写多个文件,进行模块化设计,各个功能模块用 ...

  2. 链栈的数据结构以及链栈的实现

    线性表有顺序存储结构和链式存储结构,栈属于线性表的一种,也具有顺序存储结构和链式存储结构.对于栈的链式存储结构,一般称之为链栈. 栈的插入和删除只在栈顶进行操作,在单链表中,头指针是单链表的必须元素: ...

  3. 【数据结构】链栈的实现(附带详细注释)

    前言 <数据结构系列首页>是数据结构系列文章的首页,其中会逐步更新各种数据结构的实现,有兴趣的选手可以一看. 首页中不仅有各种数据结构的实现,还有学习数据结构必备的基础知识,如果有选手觉得 ...

  4. 【数据结构】-链栈(带头结点)

    链栈-带头结点 1.头文件及类型定义 2.链栈类型定义 3.函数声明 4.基本操作 4.1 初始化链栈 4.2 判空 4.3 入栈 4.4 出栈 4.5 读取栈顶元素 4.6 main函数 5.小结 ...

  5. 严蔚敏《数据结构》——链栈

    严奶奶版数据结构,我用C写一直报错,后来发现C中没有引用,只有指针.为了还原原版的味道.这里创建了.cpp的文件,加上了#include<cstdio>和#include<cstdl ...

  6. 数据结构作业--链栈实现进制转换

    十进制转换为2,8,16进制 #include <stdio.h> #include <stdlib.h> #include <string.h>/*此处是链栈数据 ...

  7. 理论基础 —— 栈 —— 链栈

    [实现类] template <class T> struct Node{T data;Node *next; }; template <class T> class link ...

  8. 数据结构与算法(3-1)栈(顺序栈、两栈共享空间、链栈、栈的计算器)

    目录 一.顺序栈 存储结构 总代码 二.两栈共享空间 存储结构: 总代码: 三.链栈 存储结构: 总代码: 一.顺序栈 存储结构: 栈特点:先进后出,后进先出.(特殊的线性表) 入栈时在栈顶添加元素, ...

  9. 数据结构(严蔚敏)之四——链栈之c语言实现

    编写一个程序实现链栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能: (1)初始化链栈 (2)链栈置空 (3)入栈 (4)出栈 (5)取栈顶元素 (6)遍历链栈 链栈的功能实现: #incl ...

最新文章

  1. java培训:什么是抽象类?怎么定义?
  2. spring解耦原理
  3. gRPC真要取代WebApi了,你还学得过来吗?
  4. MSP430F5529 DriverLib 库函数学习笔记(四)UART通信
  5. *和**在Python中意味着什么?它与指针和地址有关吗?
  6. 电力装置的继电保护和自动装置设计规范_继电保护装置升级到微机保护装置
  7. 二进制安装mariadb 10.2.16
  8. php中向数组添加值,如何使用array_push向数组添加值和键 - php
  9. 如何更好地控制input输入框的高度
  10. excel (wps) 文件受保护处理方案
  11. 在电脑上安装python-如何在自己的电脑上安装python的idle版 - 卡饭网
  12. 如何提高自身数学分析水平
  13. linux下查看eml类型文件
  14. 万维钢解读,从数学上解释为什么绝大多数投资者都会输给市场?最可能值,远远小于平均值...
  15. 动态规划多段图和货郎担问题
  16. Mysql迁移到GaussDb_GaussDB T 使用DUMP/LOAD导出导入迁移备份数据
  17. 成熟FOC电机控制代码 大厂成熟FOC电机控制图
  18. 转区系统开放艾欧尼亚转入服务器,LOL转区系统申请客户端及操作流程介绍
  19. 灰色预测模型--两秒直接上手
  20. 西门菲莎大学计算机专业怎么样,西门菲莎大学

热门文章

  1. stm8/stm32如何通过ESP8266连接天猫精灵和小爱同学,实现(AT指令)语音助手控制硬件设备
  2. Angular 的 预先(AOT)编译器
  3. 手写简单版 Promise
  4. Rendering in Rails
  5. 性价比高台式计算机,性价比高且适合办公的台式电脑有哪些推荐?
  6. spark ml 聚类源码笔记二
  7. 关于专利申请和专利转让的期限问题,请勿错过。
  8. 此UML形状所在的绘图页不是UML模型图的一部分。该形状合计用于利用UML模型图模板创建的绘图。解决办法
  9. 计算机网络基础知识(概述的简单整理)(物理层)
  10. Linux服务器安全狗安装以及使用