【数据结构】栈(实现+原码)
目录
栈的概念及结构
栈的实现
初始化栈
销毁
入栈
出栈
获取栈顶元素
获取栈中有效元素个数
判断栈是否为空
测试
栈的概念及结构
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。
栈中的数据元素遵守后进先出LIFO(Last In First Out)原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。
栈的实现
栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int STDataType;// 下面是定长的静态栈的结构,实际中一般不实用,所以我们主要实现下面的支持动态增长的栈
#define N 10
typedef struct Stack
{STDataType _a[N];int _top; // 栈顶
}Stack;// 支持动态增长的栈
typedef struct Stack
{STDataType* a;int top;//栈顶int capacity;//栈容量
}Stack;//初始化
void StackInit(Stack*ps);//销毁
void StackDestroy(Stack* ps);//入栈
void StackPush(Stack* ps, STDataType x);//出栈
void StackPop(Stack* ps);//获取栈顶元素
STDataType StackTop(Stack* ps);//判断栈是否为空
bool StackEmpty(Stack* ps);//获取栈中有效元素个数
int StackSize(Stack* ps);
初始化栈
栈的初始化和销毁都与顺序表类似,这里就不再详细解释,只是顺序表中的size(有效元素个数),换成了这里的栈顶。
void StackInit(Stack* ps)
{assert(ps);ps->a = NULL;ps->capacity = 0;ps->top = 0;//也可初始化为-1,但在后面函数的实现中需做改变
}
销毁
void StackDestroy(Stack* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->capacity = ps->top = 0;
}
入栈
与顺序表一样,增加元素时必须先判断容量是否足够,容量不够时需扩容。
这里的入栈和顺序表的尾插一样。
void StackPush(Stack* ps, STDataType x)
{assert(ps);if (ps->top == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;STDataType* tmp = (STDataType*)realloc(ps->a , sizeof(STDataType) * newcapacity);if (tmp == NULL){perror("realloc");exit(-1);}ps->a = tmp;ps->capacity = newcapacity;}ps->a[ps->top] = x;ps->top++;
}
出栈
出栈即尾删,删除元素需判断栈是否为空,空栈不能出栈。
判断栈是否为空在下面实现。
void StackPop(Stack* ps)
{assert(ps);assert(!StackEmpty(ps));ps->top--;
}
获取栈顶元素
栈顶元素即顺序表中最后一个元素,直接根据下标即可找到。
当然栈不能为空。
STDataType StackTop(Stack* ps)
{assert(ps);assert(!StackEmpty(ps));return ps->a[ps->top - 1];
}
获取栈中有效元素个数
返回top即可。
int StackSize(Stack* ps)
{assert(ps);return ps->top;
}
判断栈是否为空
可直接根据top是否等于0判断栈是否为空。
bool StackEmpty(Stack* ps)
{assert(ps);return ps->top == 0;
}
测试
栈的测试不能将栈的每个元素依次打印,而需要先入栈,然后找栈顶元素,依次出栈。
int main()
{Stack s;StackInit(&s);StackPush(&s, 1);StackPush(&s, 2);StackPush(&s, 3);StackPush(&s, 4);StackPush(&s, 5);while (!StackEmpty(&s)){printf("%d ", StackTop(&s));StackPop(&s);}StackDestroy(&s);return 0;
}
结果如下:
【数据结构】栈(实现+原码)相关推荐
- 3-6-汉诺塔(Hanoi Tower)问题-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版...
课本源码部分 第3章 栈和队列 - 汉诺塔(Hanoi Tower)问题 --<数据结构>-严蔚敏.吴伟民版 源码使用说明 链接☛☛☛ <数据结构-C语言版> ...
- 3-8-循环队列-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版
课本源码部分 第3章 栈和队列 - 循环队列 --<数据结构>-严蔚敏.吴伟民版 源码使用说明 链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码 ...
- 计算机中的无符号有几种,【数据结构】整数类型之有符号、无符号数(原码、反码、补码)详解。...
Fist:why? 有时候只知道什么还不够,我们还需要为什么,所以我在整个数据结构系列中都要追寻这个答案. Q1:为什么需要整型数据. 因为整型数据结构跟生活密切相关,生活中.数学中到处都是整型数字. ...
- 数据结构与算法--二进制详解 Python二进制算法详解 史上最详细的二进制讲解 彻底搞懂原码、反码、补码 Python的负数二进制表示形式
阅读目录 原码.反码.补码 机器数 和 真值 原码.反码.补码的基础 Python中负数的处理 负数的补码如何转成十进制 位运算符 和 移位运算符 基本概述 妙用 二进制涉及的算法 原码.反码.补码 ...
- 数据结构栈队列链表数组
目录: 数据结构 栈(stack) 队列 链表 数组 数据结构 数据结构是什么 简单来说,数据结构就是设计数据以何种方式存储在计算机中 比如:列表,集合,与字典等都是一种数据结构 程序 = 数据结构 ...
- 这样给学妹讲原码、反码、补码,帮她彻底解决困扰了三天的问题
前言 补码是给机器看的,原码是给人看的,反码是二者的桥梁,原码反码补码虽然是简单问题,但确实很多人很长时间没有搞明白和深入思考,这篇把自己学习和理解过程记录下来,刚好一个学妹问到这个问题.本篇只讲原码 ...
- JVM【带着问题去学习 02】数据结构栈+本地方法栈+虚拟机栈+JVM栈运行原理
1.数据结构栈 栈是一种比较简单的数据结构,后进先出.栈本身是一个线性表,但是这个表中只有一端允许数据的进出.栈的常用操作包括入栈push和出栈pop,对应于数据的压入和弹出.由于栈后进先出的特性,常 ...
- 数据结构-栈(Stack)-定义与基本操作
数据结构-栈(Stack)-定义与基本操作 一. 顺序栈(Sequential Stack) 1. 定义 2. 基本操作 2.1 初始化 2.2 进栈 2.3 出栈 2.4 取栈顶元素 2.5 判空 ...
- GPGPU-SIM(原码阅读)(流多处理器部分完成)
GPGPU-SIM(原码阅读)1.0 顶层设计 GPGPU-Sim的模拟是由单指令多线程(SIMT)内核组成,这些内核通过片上互接网络连接到与图形GDDR DRAM接口的内存分区. SIMT核心模拟了 ...
最新文章
- 14_传智播客iOS视频教程_instancetype
- 【Smart_Point】动态内存与智能指针实战:文本查询程序(设计set,map,智能指针的应用)
- [导入]解决“Internet Explorer 无法打开 Internet站点已终止操作”问题
- 怎么解决tomcat占用8080端口问题图文教程 端口被占用
- Spark 键值对RDD操作
- UESTC 31 饭卡 card
- 简单实现x的n次方pta_数学学霸的解题思路1“降低次方和次元”
- 主从reactor模式
- Java枚举类的简单使用
- 4.css命名书写规范
- 资本为什么爱“吃面”?
- 微信公众号推文各标签含义
- jpa 清空数据库的写法
- 虚拟地址转换成物理地址
- windows内存占用过高解决方法
- CTC:围观大佬从语音/文字客观存在的 blank 发力,玩转前缀 + 动态规划,打造无缝衔接神经网络的不定长序列识别
- 开机出现checking file system on C或者D E F盘符的解决方法
- android 对象存储sd卡,Android网络与数据存储——File存储(实现SD卡文件浏览器)...
- 。IBM ThinkPad T60P 全面评测
- Xocde 12 pod 库 模拟器 library not found for -xxx解决办法
热门文章
- LearnOpenGL笔记——五、高级光照:“法线贴图”和”视差贴图“
- 利用mapgis6.7进行图形精校正
- android开发界面适配设计
- 关于@Transactional(readOnly = false)注解,数据新增修改Connection is read-only
- 惊了!7 行代码优雅地实现 Excel 文件导出功能?
- 秒拍升级 更智能设计升级满足用户需求
- Linux X86 PS/2键盘驱动分析记录
- 【汇编语言】8086汇编字符串定义为何使用DB?其他数据类型不可以吗?(20200515复盘)
- 谷粒商城二十二订单服务支付宝支付
- c语言奥运会志愿者报名系统,北京冬奥会和冬残奥会志愿者全球招募启动!