栈也是一种特殊的线性表,但不同的是,栈的操作与传统的线性表不同。传统的线性表可以完成随机位置存取,而栈的结构决定了它进行操作的特点:仅仅在表尾进行插入或删除操作(后进先出)。表尾端称作栈顶,而与之相对的,表头端称作栈底。可以将栈的结构与子弹弹夹进行类比,后压入的子弹先被发射,正如栈的后进先出特点一般。

假设栈中的元素如下所示:,若设置作为栈底元素,与之相对的则作为栈顶的元素,是最后一个被压入栈的,同时也会是第一个出栈的。元素输入栈的顺序与输出栈的顺序直接相反。栈的结构示意图如下:

栈的结构

栈的顺序表示基本结构如下,要求利用一组地址连续的内存单元来存储信息,元素的数据按顺序由栈底依次存储到栈顶,再由栈顶开始依次向下取出或添加元素 。在栈的顺序表示之中,先定义栈的类名为SqStack,需要设置名为base与top的两个指针,分别指示栈底的内存与栈顶的内存,同时定义int类型的变量用于设置栈的内存。代码如下:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define size 1000
#define incresize 10
using namespace std;
typedef struct
{int *base;int *top;int stacksize;
}SqStack;

在定义了栈的基本结构后,按照设定的分配量size分配结点指针所指的内存的空间,base名为栈底指针,指向栈底部元素的内存。top名为栈顶指针,初始化与base指针指向相同,栈的内存设置为size变量。插入与删除元素之时,仅仅需要移动栈顶指针即可。由栈的指针的结构可以看出,非空栈的栈顶指针始终指向的是栈顶元素的上一个位置,这与顺序表插入节点的操作也是类似的。顺序栈的结构初始化代码如下:

void Init(SqStack s)
{s.base=(int *)malloc(size*sizeof(int));s.top=s.base;s.stacksize=size;
}

栈进行了初始化操作后,开始定义三个基本操作,分别是入栈出栈以及获取栈顶元素。入栈操作主要思路如下:1)先进行内存是否溢出的判别,由于栈所占用的内存是连续一片内存,所以,当栈顶指针减去栈底指针的数值差大于栈的设置长度时,需要重新定义栈底指针(base)所指的内存的大小    2)进行判别完毕后,重置top指针指向的内存    3)将元素e入栈,具体操作为栈顶指针top上移一位,指针所指的内存赋值为e(返回值为e)。具体代码如下:

void push(SqStack s,int e)
{if(s.top-s.base>s.stacksize){s.base=(int*)realloc(s.base,(s.stacksize+incresize)*sizeof(int));s.top=s.base+s.stacksize;s.stacksize+=incresize;}*s.top++=e;
}

与入栈操作相反地,出栈操作不需要进行内存的判别,只需要先将栈顶指针下移,接着用int类型的变量e返回栈顶元素的值即可。具体代码如下:

void pop(SqStack s,int e)
{if(s.top!=s.base){e=*(--s.top);}cout<<e<<endl;
}

根据栈的结构,不难得出获得栈顶元素的具体操作 :仅仅只需要访问栈顶指针所指内存的下一个单位内存,并用int 类型的变量e返回该指针所指内存的数据域。   具体代码如下:

void GetTop(SqStack s,int e)
{if(s.top!=s.base){e=*(s.top-1);cout<<e<<endl;}
}

栈的基本结构与基本操作相关推荐

  1. 实验一 链式存储结构的基本操作

    广州大学学生实验报告 开课实验室:计算机科学与工程实验(电子楼418A) 2019年4月27日 学院 计算机科学与教育软件学院 年级.专业.班 计算机科学与技术172班 姓名 xxx 学号 17061 ...

  2. 栈——栈的基本概念和基本操作

    文章目录 栈 栈的基本概念 栈的定义 栈的重要术语 栈的特点 栈的基本操作 创.销 增.删 查 判空 栈的数学性质 栈 本文我们初次学习栈,分为栈的基本概念和基本操作两个部分. 学习数据结构,我们的学 ...

  3. 数据结构——栈的顺序存储结构

    一.栈的概念 栈是一种操作受限的,只允许一端进行插入和删除的线性表,允许进行操作的一端叫做栈顶(top),另一端为栈底(bottom),插入操作为入栈或进栈,删除操作称为出栈或退栈. 二.栈的顺序存储 ...

  4. 栈之顺序结构和链式结构

    栈的顺序结构实现 typedef int Position; struct SNode {ElementType *Data; /* 存储元素的数组 */Position Top; /* 栈顶指针 * ...

  5. 栈的顺序存储结构、链式存储架构及其实现

    顺序栈和链式栈的时间复杂度均为O(1), 因此唯一可以比较的是空间性能.初始时顺序栈必须开辟一个固定的长度内存,所以存在可存储元素个数限制和浪费空间的问题.链式栈没有栈满的问题,只有当内存空间用完才会 ...

  6. 栈的顺序存储结构框架搭建

    栈的顺序存储结构 数组模拟 #define MAX_SIZE 1024 #define SEQSTACK_TRUE 1 #define SEQSTACK_FALSE 0 结构体 typedef str ...

  7. 【ES笔记01】ElasticSearch数据库之index索引、doc文档、alias别名、mappings映射结构的基本操作

    这篇文章,主要介绍ElasticSearch数据库之index索引.doc文档.alias别名.mappings映射结构的基本操作. 目录 一.索引index相关操作 1.1.创建索引 1.2.查询索 ...

  8. 栈的顺序存储结构(顺序栈)

    栈的顺序存储结构 1.顺序栈的存储结构 #define MAXSIZE 100 //顺序栈存储空间的初始分配 typedef struct{SElemType *base; //栈底指针SElemTy ...

  9. 数据结构-栈的顺序结构两种方式

    第一种结构: 存储空间有限,适用于知道存储长度的情况下.操作实现很简单. 1 #include "stdio.h" 2 3 4 #define MAXSIZE 50 5 #defi ...

最新文章

  1. ASP.NET MVC实践系列9-filter原理与实践
  2. matlab在图像上画出来的矩形框如何变成可托动的_计算机基础系列:源代码如何被计算机执行...
  3. angula简单应用---购物篮
  4. java适配器模式 场景_Java设计模式之《适配器模式》及应用场景
  5. Satwe楼板能用弹性模计算吗_现浇楼板淋水后却出现裂缝,还好老师傅有经验,多是这3点造成的...
  6. ucosii任务堆栈的作用是什么呢?
  7. 常用的几种卷积神经网络介绍
  8. python自动测试a_python自动化单元测试
  9. python中string.digits_Python string.hexdigits方法代码示例
  10. Nginx upstream性能优化
  11. C# 5.0将带来的五大新特性
  12. ERROR: Cannot uninstall ‘wrapt‘. It is a distutils installed project and thus we cannot accurately
  13. CUHK Occlusion Dataset(行人检测数据集)转换为YOLO+VOC数据集
  14. 集宁一中高122班聚会议程安排
  15. 计算机常用英语词汇表
  16. win10 dpc_watchdog_violation 蓝屏
  17. 【UI】产品设计之什么是色彩情绪
  18. idea maven项目无法下载自定义的仓库完美解决办法
  19. 科研日志——使用opencv提取视频中的人脸
  20. 韩国瑜上任后 高雄六合夜市摊位出租率上升租金看涨

热门文章

  1. List和Map集合遍历的3种方式
  2. 如何在笔记本上设置wifi热点(菜鸟篇)
  3. ROS学习----依据ROS入门教程,整理的ROS命令
  4. 剪刀石头布二(ptwo) 时限:1s 空间:256m
  5. 【String类和标准模板库】
  6. c# propertyGrid下拉选项
  7. springboot整合redis缓存报错
  8. useNavigate使用报错
  9. PS2 键盘在win10下开机过程 收发的数据
  10. Hbase hive kudu的区别和使用场景