目录

栈的概念及结构

栈的实现

初始化栈

销毁

入栈

出栈

获取栈顶元素

获取栈中有效元素个数

判断栈是否为空

测试


栈的概念及结构

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。

栈中的数据元素遵守后进先出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;
}

结果如下:

【数据结构】栈(实现+原码)相关推荐

  1. 3-6-汉诺塔(Hanoi Tower)问题-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版...

    课本源码部分 第3章  栈和队列 - 汉诺塔(Hanoi Tower)问题 --<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版> ...

  2. 3-8-循环队列-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第3章  栈和队列 - 循环队列 --<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码 ...

  3. 计算机中的无符号有几种,【数据结构】整数类型之有符号、无符号数(原码、反码、补码)详解。...

    Fist:why? 有时候只知道什么还不够,我们还需要为什么,所以我在整个数据结构系列中都要追寻这个答案. Q1:为什么需要整型数据. 因为整型数据结构跟生活密切相关,生活中.数学中到处都是整型数字. ...

  4. 数据结构与算法--二进制详解 Python二进制算法详解 史上最详细的二进制讲解 彻底搞懂原码、反码、补码 Python的负数二进制表示形式

    阅读目录 原码.反码.补码 机器数 和 真值 原码.反码.补码的基础 Python中负数的处理 负数的补码如何转成十进制 位运算符 和 移位运算符 基本概述 妙用 二进制涉及的算法 原码.反码.补码 ...

  5. 数据结构栈队列链表数组

    目录: 数据结构 栈(stack) 队列 链表 数组 数据结构 数据结构是什么 简单来说,数据结构就是设计数据以何种方式存储在计算机中 比如:列表,集合,与字典等都是一种数据结构 程序 = 数据结构 ...

  6. 这样给学妹讲原码、反码、补码,帮她彻底解决困扰了三天的问题

    前言 补码是给机器看的,原码是给人看的,反码是二者的桥梁,原码反码补码虽然是简单问题,但确实很多人很长时间没有搞明白和深入思考,这篇把自己学习和理解过程记录下来,刚好一个学妹问到这个问题.本篇只讲原码 ...

  7. JVM【带着问题去学习 02】数据结构栈+本地方法栈+虚拟机栈+JVM栈运行原理

    1.数据结构栈 栈是一种比较简单的数据结构,后进先出.栈本身是一个线性表,但是这个表中只有一端允许数据的进出.栈的常用操作包括入栈push和出栈pop,对应于数据的压入和弹出.由于栈后进先出的特性,常 ...

  8. 数据结构-栈(Stack)-定义与基本操作

    数据结构-栈(Stack)-定义与基本操作 一. 顺序栈(Sequential Stack) 1. 定义 2. 基本操作 2.1 初始化 2.2 进栈 2.3 出栈 2.4 取栈顶元素 2.5 判空 ...

  9. GPGPU-SIM(原码阅读)(流多处理器部分完成)

    GPGPU-SIM(原码阅读)1.0 顶层设计 GPGPU-Sim的模拟是由单指令多线程(SIMT)内核组成,这些内核通过片上互接网络连接到与图形GDDR DRAM接口的内存分区. SIMT核心模拟了 ...

最新文章

  1. 14_传智播客iOS视频教程_instancetype
  2. 【Smart_Point】动态内存与智能指针实战:文本查询程序(设计set,map,智能指针的应用)
  3. [导入]解决“Internet Explorer 无法打开 Internet站点已终止操作”问题
  4. 怎么解决tomcat占用8080端口问题图文教程 端口被占用
  5. Spark 键值对RDD操作
  6. UESTC 31 饭卡 card
  7. 简单实现x的n次方pta_数学学霸的解题思路1“降低次方和次元”
  8. 主从reactor模式
  9. Java枚举类的简单使用
  10. 4.css命名书写规范
  11. 资本为什么爱“吃面”?
  12. 微信公众号推文各标签含义
  13. jpa 清空数据库的写法
  14. 虚拟地址转换成物理地址
  15. windows内存占用过高解决方法
  16. CTC:围观大佬从语音/文字客观存在的 blank 发力,玩转前缀 + 动态规划,打造无缝衔接神经网络的不定长序列识别
  17. 开机出现checking file system on C或者D E F盘符的解决方法
  18. android 对象存储sd卡,Android网络与数据存储——File存储(实现SD卡文件浏览器)...
  19. 。IBM ThinkPad T60P 全面评测
  20. Xocde 12 pod 库 模拟器 library not found for -xxx解决办法

热门文章

  1. LearnOpenGL笔记——五、高级光照:“法线贴图”和”视差贴图“
  2. 利用mapgis6.7进行图形精校正
  3. android开发界面适配设计
  4. 关于@Transactional(readOnly = false)注解,数据新增修改Connection is read-only
  5. 惊了!7 行代码优雅地实现 Excel 文件导出功能?
  6. 秒拍升级 更智能设计升级满足用户需求
  7. Linux X86 PS/2键盘驱动分析记录
  8. 【汇编语言】8086汇编字符串定义为何使用DB?其他数据类型不可以吗?(20200515复盘)
  9. 谷粒商城二十二订单服务支付宝支付
  10. c语言奥运会志愿者报名系统,北京冬奥会和冬残奥会志愿者全球招募启动!