当前位置: 首页 > news >正文

数据结构-c/c++实现栈(详解,栈容量可以动态增长)

一.栈的基本介绍

        栈是一种只能够在一端进行插入和删除的顺序表。如下图

空栈:表示不含任何元素的栈

栈顶:表示允许进行插入和删除元素的一端

栈底:表示不允许进行插入和删除元素的一端

即栈是一种后进先出的线性表数据结构

二.栈的常见操作

StackInit:初始化栈

StackDestory:销毁栈

StackPop:删除栈顶元素

StackPush:向栈顶插入元素

StackSize:计算栈中元素并返回

StackEmpty:判断栈是否为空

StackTop:返回栈顶元素

三.各操作代码实现详解

        栈结构的描述代码

typedef int DataType;typedef struct Stack
{DataType* a;    //存储栈的数组int Top;        //指向栈顶元素的下标int Size;       //栈元素大小
}ST;

3.1 StackInit

        初始化栈只需要对栈中的三个元素依次初始化即可

//初始化栈
void StackInit(ST* st)
{assert(st != nullptr);st->a = nullptr;st->Top = 0;st->Size = 0;
}

3.2 StackDestory

//销毁栈
void StackDestory(ST* st)
{assert(st != nullptr);free(st->a);	//释放数据st->Size = 0;	//将容量和栈顶指针置0st->Top = 0;
}

3.3 StackPop

//删除数据
void StackPop(ST* st)
{assert(st != nullptr);assert(st->Top > 0);//有数据才能删除st->Top--;//直接让Top减少1即可
}

3.4 StackPush

//插入数据
void StackPush(ST* st, DataType x)
{assert(st != nullptr);if (st->Size == st->Top){int newCapacity = st->Size == 0 ? 4 : st->Size * 2;//设置新空间大小,每次增长两倍DataType* tmp = new DataType[newCapacity];for (int i = 0; i < st->Size; i++){tmp[i] = st->a[i];}//C语言方式//DataType* tmp = (DataType*)realloc(st->a, sizeof(DataType) * newCapacity);if (tmp == nullptr){cout << "new error" << endl;exit(-1);}st->a = tmp;st->Size = newCapacity;}st->a[st->Top] = x;st->Top++;
}

3.5 StackSize

//计算栈容量大小
int StackSize(ST* st)
{assert(st != nullptr);assert(st->Top != 0);return st->Top;
}

3.6 StackEmpty

//判断栈是否为空
bool StatkEmpty(ST* st)
{assert(st->a);if (st->Top == 0){return true;}else{return false;}
}

3.7StackTop

//返回栈顶数据
DataType StackTop(ST* st)
{assert(st != nullptr);assert(st->Top > 0);          //栈顶有元素才能返回return st->a[st->Top - 1];    //位置是Top-1的原因是Top从0开始,表示的是栈顶的后一位
}

四.简单测试

        测试代码1

#define _CRT_SECURE_NO_WARNINGS 1
#include"stack.h"void test1()
{ST st;StackInit(&st);StackPush(&st, 1);StackPush(&st, 9);StackPush(&st, 4);StackPush(&st, 6);StackPush(&st, -1);while (!StackEmpty(&st)){cout << StackTop(&st) << endl;StackPop(&st);}
}int main()
{test1();
}

运行结果

加入pop

#define _CRT_SECURE_NO_WARNINGS 1
#include"stack.h"void test1()
{ST st;StackInit(&st);StackPush(&st, 1);StackPush(&st, 9);StackPop(&st);StackPush(&st, 4);StackPop(&st);StackPush(&st, 6);StackPush(&st, -1);while (!StackEmpty(&st)){cout << StackTop(&st) << endl;StackPop(&st);}
}int main()
{test1();
}

测试结果

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MySQL——基础操作
  • 【Unity】简单机甲运动系统——坦克式操控方式
  • 房产报备小程序房产报备系统源码搭建方案
  • GPT-SoVITS-WebUI 初体验
  • 专栏引言:迈向大数据分析的最前沿
  • Java 单元测试指南
  • Nginx IP 哈希负载均衡配置:实现请求智能分发
  • WebForms DataList 控件深入解析
  • Vulnhub靶场 | DC系列 - DC7
  • Vue3安装Element Plus
  • 怎样通过bs4找出程序中 标签<div class=“List2“>中所有的<li>的内容?
  • 【计算机网络】计算机网络的性能指标
  • 5.3二叉树——二叉树链式结构实现
  • 数学基础 -- 线性代数之矩阵的逆
  • 行为模式7.解释器模式------DSL语言
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • C++类的相互关联
  • gops —— Go 程序诊断分析工具
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • If…else
  • JDK9: 集成 Jshell 和 Maven 项目.
  • js中的正则表达式入门
  • leetcode讲解--894. All Possible Full Binary Trees
  • mysql_config not found
  • node-glob通配符
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • swift基础之_对象 实例方法 对象方法。
  • vuex 学习笔记 01
  • 对象管理器(defineProperty)学习笔记
  • 简单数学运算程序(不定期更新)
  • 解决iview多表头动态更改列元素发生的错误
  • 思维导图—你不知道的JavaScript中卷
  • 网络应用优化——时延与带宽
  • 微信小程序设置上一页数据
  • 学习ES6 变量的解构赋值
  • 译有关态射的一切
  • k8s使用glusterfs实现动态持久化存储
  • Spring第一个helloWorld
  • 正则表达式-基础知识Review
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #define,static,const,三种常量的区别
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • (k8s)Kubernetes本地存储接入
  • (pojstep1.1.2)2654(直叙式模拟)
  • (八)Flask之app.route装饰器函数的参数
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (四)React组件、useState、组件样式
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)拼包函数及网络封包的异常处理(含代码)
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .Family_物联网