栈的顺序存储及实现(二)
栈的介绍
栈(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;
}
运行结果
栈的顺序存储及实现(二)相关推荐
- 数据结构——栈的顺序存储结构
一.栈的概念 栈是一种操作受限的,只允许一端进行插入和删除的线性表,允许进行操作的一端叫做栈顶(top),另一端为栈底(bottom),插入操作为入栈或进栈,删除操作称为出栈或退栈. 二.栈的顺序存储 ...
- 栈的顺序存储结构、链式存储架构及其实现
顺序栈和链式栈的时间复杂度均为O(1), 因此唯一可以比较的是空间性能.初始时顺序栈必须开辟一个固定的长度内存,所以存在可存储元素个数限制和浪费空间的问题.链式栈没有栈满的问题,只有当内存空间用完才会 ...
- 栈的顺序存储结构框架搭建
栈的顺序存储结构 数组模拟 #define MAX_SIZE 1024 #define SEQSTACK_TRUE 1 #define SEQSTACK_FALSE 0 结构体 typedef str ...
- python 全栈开发,Day128(创建二维码,扫码,创建玩具的基本属性)
python 全栈开发,Day128(创建二维码,扫码,创建玩具的基本属性) 昨日内容回顾 1.app播放音乐plus.audio.createPlayer(文件路径/URL)player.play( ...
- C语言实现 二叉树 的非递归遍历(详细图解)(基于栈的顺序存储)
分析主要分析二叉树的非递归遍历,基于栈顺序存储二叉树的节点. 1 实现思路(具体的分析过程会在以下函数实现部分分析,中序遍历如下) 将树的所有节点标志位置为假(0),并将根节点压入栈中 进入循环,只要 ...
- Lison《vue技术栈开发实战》(二)
Lison<vue技术栈开发实战>(二) 状态管理bus的使用 父子组件通信 v-model语法糖 使用bus通信 状态管理Vuex(一) state和getter 辅助函数的使用 模块中 ...
- 栈的顺序存储结构(顺序栈)
栈的顺序存储结构 1.顺序栈的存储结构 #define MAXSIZE 100 //顺序栈存储空间的初始分配 typedef struct{SElemType *base; //栈底指针SElemTy ...
- 用WEB技术栈开发NATIVE应用(二):WEEX 前端SDK原理详解
摘要: WEEX依旧采取传统的web开发技术栈进行开发,同时app在终端的运行体验不输native app.其同时解决了开发效率.发版速度以及用户体验三个核心问题.那么WEEX是如何实现的?目前WEE ...
- 栈的顺序存储及实现(一)
继续学习数据结构,今天我们来学习栈的相关知识.其实学习没有捷径,如果抱着一种吃快餐的态度进行学习,那是学不到东西,各种技术都是浅尝辄止,那注定学习是不会有太大的效果.不知道你们讨不讨厌 某某语言从入门 ...
最新文章
- 盘点丨2017年人工智能带火了哪些词
- (JAVA学习笔记) 关于类的封装
- linux下java调用python脚本,java - 在Linux Terminal中以编程方式从Java调用python脚本 - 堆栈内存溢出...
- kibana7.x操作
- myeclipse 10安装svn插件
- boost::enable_current_exception用法测试程序
- SHELL编程实现批量Netatalk字符集文件名替换
- Qt Creator基本使用方法
- vscode控制字符引起的问题以及解决思路
- 如何发表高水平论文(转载,非常好)
- 用JAVA制作小游戏——推箱子(二)
- 对于局部变量_浅谈Shell函数中全局变量和局部变量
- 疫情之下,精准测试的智能可信模式正在成为中流砥柱
- el表达式/jstl保留两位小数
- iptables数据包、连接标记模块MARK/CONNMARK的使用(打标签)
- 硬件实用技巧:OrCad自带原理图olb/OLB库枚举介绍
- python中关于object和type的个人理解
- 杭州毕业生就业创业补贴全攻略
- 模拟题 czy的后宫
- 论文阅读三:基于改进人工蜂群算法的SDN负载均衡策略研究
热门文章
- FCPX插件:科幻切割分屏转场效果XEffects Tech Transitions mac版
- 提高篇 第三部分 图论 第4章 差分约束系统
- springmvc怎么设置更改了界面不用重启_CentOS root登录密码忘记了 怎么办?
- RTX5 | 线程管理04 - 线程加入osThreadJoin
- STM32H743+CubeMX-串口重定向printf
- APK反编译之APKTOOL的使用
- linux 共享库目录,Linux共享库
- NiceScroll文档阅读笔记-NiceScroll(3.7.6)基本使用
- Qt笔记-AES加密
- Nacos笔记-对Nacos初步认识