数据结构 栈-链栈及基本操作
目录
- 一.栈的定义
- 二.栈的特点
- 三.栈的理解
- 四.链栈引入
- 五.链栈定义
- 六.链栈的结构体设计
- 七.链栈的基本操作
- 7.1链栈的初始化
- 7.2链栈判空
- 7.3链栈入栈
- 7.4链栈出栈
- 7.4取栈顶元素
- 八.总结
一.栈的定义
栈是限定仅在表尾进行插入和删除操作的数据结构(受到限制的线性表)。
我们把允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何元素为空栈。
二.栈的特点
后进先出
比如word,浏览器网页等一系列软件中,都有撤销的操作,就是利用栈的这种方式来实现的,可能不同软件的代码不同,但是他们的原理是一样的均为:后进先出。
三.栈的理解
- 栈是一个线性表,有前驱后继关系,只不过这里的表尾指的是栈顶。
- 栈限制了线性表的插入和删除位置,这也导致栈底是固定的。
- 栈的插入操作,叫做进栈;可以理解为子弹入弹夹。
- 栈的删除操作,叫做出栈;可以理解为子弹出弹夹。
四.链栈引入
既然栈是属于线性表的一种,那么存储结构也就分为顺序存储和链式存储,这里我们着重讲解链式存储结构。
五.链栈定义
栈的链式存储结构,简称链栈。
对于栈来说,只在栈顶做插入和删除操作,由于单链表有头指针,栈顶指针也是必须的,那我们干脆就将头指针和栈顶指针合二为一,将栈顶放在单链表的头部。通常对于链栈是不需要头结点的。
对于链栈来说,一般不会存在栈满的情况,如果这种事情真的发生,那么此时的计算机操作系统也将会面临死机崩溃的情况,那就不单单是这个链栈是否溢出的问题了。对于链表来说,链表为空的表示是头结点指向空,那么对于链栈来讲,链栈为空就是栈顶指针指向空(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链栈入栈
入栈就是:
- 先对数据域进行赋值;
- 然后让新结点指向栈顶指针;
- 最后将栈顶指针交给新节点。
假设元素值为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链栈出栈
出栈就是:
- 将要删除的元素的值交给临时变量,将栈顶指针交给临时节点;
- 将栈顶指针下移;
- 最后释放临时节点(即完成删除)。
假设变量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;}
}
八.总结
对比顺序栈和链栈,如果栈的使用过程中元素变化不可预料,有时小,有时大,那么最好用链栈;反之,如果他的变化在可控范围之内建议使用顺序栈会更好点。
(小白一位,如有错误欢迎指正)
数据结构 栈-链栈及基本操作相关推荐
- 停车场管理系统(C语言顺序栈+链栈+链队列)
一.实验目的 1.根据停车场管理系统的要求,利用结构化程序设计方法以及C的编程思想来完成系统的设计,使用数据结构中的栈.队列进行分析: 2.按功能定义函数或书写多个文件,进行模块化设计,各个功能模块用 ...
- 链栈的数据结构以及链栈的实现
线性表有顺序存储结构和链式存储结构,栈属于线性表的一种,也具有顺序存储结构和链式存储结构.对于栈的链式存储结构,一般称之为链栈. 栈的插入和删除只在栈顶进行操作,在单链表中,头指针是单链表的必须元素: ...
- 【数据结构】链栈的实现(附带详细注释)
前言 <数据结构系列首页>是数据结构系列文章的首页,其中会逐步更新各种数据结构的实现,有兴趣的选手可以一看. 首页中不仅有各种数据结构的实现,还有学习数据结构必备的基础知识,如果有选手觉得 ...
- 【数据结构】-链栈(带头结点)
链栈-带头结点 1.头文件及类型定义 2.链栈类型定义 3.函数声明 4.基本操作 4.1 初始化链栈 4.2 判空 4.3 入栈 4.4 出栈 4.5 读取栈顶元素 4.6 main函数 5.小结 ...
- 严蔚敏《数据结构》——链栈
严奶奶版数据结构,我用C写一直报错,后来发现C中没有引用,只有指针.为了还原原版的味道.这里创建了.cpp的文件,加上了#include<cstdio>和#include<cstdl ...
- 数据结构作业--链栈实现进制转换
十进制转换为2,8,16进制 #include <stdio.h> #include <stdlib.h> #include <string.h>/*此处是链栈数据 ...
- 理论基础 —— 栈 —— 链栈
[实现类] template <class T> struct Node{T data;Node *next; }; template <class T> class link ...
- 数据结构与算法(3-1)栈(顺序栈、两栈共享空间、链栈、栈的计算器)
目录 一.顺序栈 存储结构 总代码 二.两栈共享空间 存储结构: 总代码: 三.链栈 存储结构: 总代码: 一.顺序栈 存储结构: 栈特点:先进后出,后进先出.(特殊的线性表) 入栈时在栈顶添加元素, ...
- 数据结构(严蔚敏)之四——链栈之c语言实现
编写一个程序实现链栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能: (1)初始化链栈 (2)链栈置空 (3)入栈 (4)出栈 (5)取栈顶元素 (6)遍历链栈 链栈的功能实现: #incl ...
最新文章
- java培训:什么是抽象类?怎么定义?
- spring解耦原理
- gRPC真要取代WebApi了,你还学得过来吗?
- MSP430F5529 DriverLib 库函数学习笔记(四)UART通信
- *和**在Python中意味着什么?它与指针和地址有关吗?
- 电力装置的继电保护和自动装置设计规范_继电保护装置升级到微机保护装置
- 二进制安装mariadb 10.2.16
- php中向数组添加值,如何使用array_push向数组添加值和键 - php
- 如何更好地控制input输入框的高度
- excel (wps) 文件受保护处理方案
- 在电脑上安装python-如何在自己的电脑上安装python的idle版 - 卡饭网
- 如何提高自身数学分析水平
- linux下查看eml类型文件
- 万维钢解读,从数学上解释为什么绝大多数投资者都会输给市场?最可能值,远远小于平均值...
- 动态规划多段图和货郎担问题
- Mysql迁移到GaussDb_GaussDB T 使用DUMP/LOAD导出导入迁移备份数据
- 成熟FOC电机控制代码 大厂成熟FOC电机控制图
- 转区系统开放艾欧尼亚转入服务器,LOL转区系统申请客户端及操作流程介绍
- 灰色预测模型--两秒直接上手
- 西门菲莎大学计算机专业怎么样,西门菲莎大学