栈的介绍

栈(stack)是限定仅在表尾进行插入和删除操作的线性表
我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又被称为后进先出(LastIn First Out)的线性表,简称LIOF结构。
首先它是一个线性表,也就是说,栈元素具有线性关系,即前驱后继关系。只不过它是一种特殊的线性表而已

代码实现

栈一般的实现都是用顺序存储结构进行实现的,上次我们在栈的顺序存储结构及实现(一)采用的数组进行实现,但是数组有个瓶颈就是固定了栈的长度这次我们才采用动态获取内存空间,当压栈时如果栈满进行动态的扩充容量,进行栈的实现

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define STACK_INIT_SIZE 5
#define STACK_INCREMENT 5
typedef int Status;
typedef int EleType;typedef struct SeqStack
{EleType* top;//栈顶指针EleType* base;//栈底指针int stackSize;//栈容量
}SeqStack;
//初始化栈
Status InitStack(SeqStack* stack)
{//开辟空间stack->base = stack->top = (EleType*)malloc(STACK_INIT_SIZE*sizeof(EleType));if (!stack->base){exit(0);}return OK;
}
/*
清空栈
*/
Status ClearStack(SeqStack* stack) {if (NULL == stack) {return ERROR;}//清空栈 实质上是忽略栈中数据,可以再次使用内存单元stack->top = stack->base;return OK;
}
/*
销毁栈
*/
Status DestroyStack(SeqStack* stack)
{if (NULL == stack) {return ERROR;}//销毁栈 是释放栈在内存中占用的空间资源if (!stack->base){free(stack->base);}stack->top = stack->base = NULL;stack->stackSize = 0;return OK;
}
//获取栈长度(栈中元素个数)
int LengthStack(SeqStack stack)
{return stack.top - stack.base;
}
//压栈
Status push(SeqStack* stack,EleType e)
{if (stack == NULL){return ERROR;}//压栈之前检测容量是否足够if (stack->top - stack->base == stack->stackSize){//超出容量 进行扩容,使用realloc函数,会拷贝原内存内容stack->base = (SeqStack*)realloc(stack->base, stack->stackSize+STACK_INCREMENT);if (!stack->base){exit(0);}stack->top = stack->base + stack->stackSize;stack->stackSize += STACK_INCREMENT;}*stack->top = e;stack->top++;return OK;
}
//弹栈
Status pop(SeqStack* stack, EleType *e)
{if (stack == NULL || e == NULL){return ERROR;}//空栈if (stack->top == stack->base){return ERROR;}*stack->top--;*e = *stack->top;return OK;
}
/*
判断栈是否为空
*/
int IsEmptyStack(SeqStack* stack) {if (NULL == stack) {return ERROR;}if (stack->top == stack->base) {return TRUE;}return FALSE;
}
/*
获取栈顶元素
*/
Status GetTop(SeqStack* stack, EleType *e) {if (NULL == stack) {return ERROR;}*e = *(stack->top - 1);return OK;
}
/*
从栈顶向下展示元素值
*/
Status ShowStack(SeqStack* stack) {if (NULL == stack || stack->top == stack->base) {return ERROR;}EleType *top = stack->top;while (top != stack->base){top--;printf("%d\n", *top);}return OK;
}
int main(int argc, char *argv[])
{SeqStack stack;//创建顺序栈InitStack(&stack);//初始化printf("压入元素5,4,3,2,1\n");push(&stack, 5);push(&stack, 4);push(&stack, 3);push(&stack, 2);push(&stack, 1);puts("栈元素展示:");ShowStack(&stack);puts("弹出2个元素后");puts("栈元素展示:");EleType e1, e2,e3;pop(&stack, &e1);pop(&stack, &e2);ShowStack(&stack);printf("弹出元素为:%d,%d\n", e1, e2);//测试是否动态扩充容量push(&stack,8);push(&stack,9);push(&stack,10);printf("压入元素8,9,10\n");puts("栈元素展示:");ShowStack(&stack);GetTop(&stack, &e3);printf("栈顶元素为:%d\n", e3);DestroyStack(&stack);return 0;
}

运行结果

栈的顺序存储及实现(二)相关推荐

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

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

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

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

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

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

  4. python 全栈开发,Day128(创建二维码,扫码,创建玩具的基本属性)

    python 全栈开发,Day128(创建二维码,扫码,创建玩具的基本属性) 昨日内容回顾 1.app播放音乐plus.audio.createPlayer(文件路径/URL)player.play( ...

  5. C语言实现 二叉树 的非递归遍历(详细图解)(基于栈的顺序存储)

    分析主要分析二叉树的非递归遍历,基于栈顺序存储二叉树的节点. 1 实现思路(具体的分析过程会在以下函数实现部分分析,中序遍历如下) 将树的所有节点标志位置为假(0),并将根节点压入栈中 进入循环,只要 ...

  6. Lison《vue技术栈开发实战》(二)

    Lison<vue技术栈开发实战>(二) 状态管理bus的使用 父子组件通信 v-model语法糖 使用bus通信 状态管理Vuex(一) state和getter 辅助函数的使用 模块中 ...

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

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

  8. 用WEB技术栈开发NATIVE应用(二):WEEX 前端SDK原理详解

    摘要: WEEX依旧采取传统的web开发技术栈进行开发,同时app在终端的运行体验不输native app.其同时解决了开发效率.发版速度以及用户体验三个核心问题.那么WEEX是如何实现的?目前WEE ...

  9. 栈的顺序存储及实现(一)

    继续学习数据结构,今天我们来学习栈的相关知识.其实学习没有捷径,如果抱着一种吃快餐的态度进行学习,那是学不到东西,各种技术都是浅尝辄止,那注定学习是不会有太大的效果.不知道你们讨不讨厌 某某语言从入门 ...

最新文章

  1. 盘点丨2017年人工智能带火了哪些词
  2. (JAVA学习笔记) 关于类的封装
  3. linux下java调用python脚本,java - 在Linux Terminal中以编程方式从Java调用python脚本 - 堆栈内存溢出...
  4. kibana7.x操作
  5. myeclipse 10安装svn插件
  6. boost::enable_current_exception用法测试程序
  7. SHELL编程实现批量Netatalk字符集文件名替换
  8. Qt Creator基本使用方法
  9. vscode控制字符引起的问题以及解决思路
  10. 如何发表高水平论文(转载,非常好)
  11. 用JAVA制作小游戏——推箱子(二)
  12. 对于局部变量_浅谈Shell函数中全局变量和局部变量
  13. 疫情之下,精准测试的智能可信模式正在成为中流砥柱
  14. el表达式/jstl保留两位小数
  15. iptables数据包、连接标记模块MARK/CONNMARK的使用(打标签)
  16. 硬件实用技巧:OrCad自带原理图olb/OLB库枚举介绍
  17. python中关于object和type的个人理解
  18. 杭州毕业生就业创业补贴全攻略
  19. 模拟题 czy的后宫
  20. 论文阅读三:基于改进人工蜂群算法的SDN负载均衡策略研究

热门文章

  1. FCPX插件:科幻切割分屏转场效果XEffects Tech Transitions mac版
  2. 提高篇 第三部分 图论 第4章 差分约束系统
  3. springmvc怎么设置更改了界面不用重启_CentOS root登录密码忘记了 怎么办?
  4. RTX5 | 线程管理04 - 线程加入osThreadJoin
  5. STM32H743+CubeMX-串口重定向printf
  6. APK反编译之APKTOOL的使用
  7. linux 共享库目录,Linux共享库
  8. NiceScroll文档阅读笔记-NiceScroll(3.7.6)基本使用
  9. Qt笔记-AES加密
  10. Nacos笔记-对Nacos初步认识