文章目录

  • (1)前言
    • 1)栈的概念
    • 2)进栈出栈的形式
    • 3)栈的存储结构
  • (2)栈的实现(顺序栈)
    • 1)栈的定义
    • 2)栈的初始化
    • 3)栈的销毁
    • 4)入栈
    • 5)出栈
    • 6)检测栈是否为空
    • 7)获取栈中有效元素个数
    • 8)获取栈顶元素
  • (3)测试栈的功能

数据结构系列文章:

【数据结构入门】顺序表(SeqList)详解(初始化、增、删、查、改)

【数据结构入门】无头单向非循环链表(SList)详解(定义、增、删、查、改) | 图解链表,超生动详细哦~

【数据结构入门】带头双向循环链表(List)详解(定义、增、删、查、改) | 配有大量图解,超详细哦~

【数据结构入门】顺序表和链表的区别,以及啥是缓存利用率

(1)前言

1)栈的概念

:是一种特殊的线性表,其只允许在表尾进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

压栈:栈的插入操作叫做进栈 / 压栈 / 入栈,入数据在栈顶

出栈:栈的删除操作叫做出栈。出数据也在栈顶

2)进栈出栈的形式

栈对线性表的插入和删除的位置做了限制,并没有对元素进出的时间进行限制,所以,在不是所有元素都进栈的情况下,事先进去的元素也可以出栈,只要保证是栈顶元素出栈就可以。

所以栈是:一种入栈顺序,多种出栈顺序

比如:现在有元素1、2、3依次进栈,出栈顺序有哪些?

  • 第一种:1、2、3(1进、1出、2进、2出、3进、3出)
  • 第二种:3、2、1(1、2、3进,3、2、1出)
  • 第三种:2、1、3(1、2进,2、1出,3进、3出)
  • 第四种:1、3、2(1进、1出,2、3进,3、2出)
  • 第五种:2、3、1(1、2进,2出,3进,3出,1出)

3)栈的存储结构

  • 栈的顺序存储结构

数组的首元素作为栈底,另外一端作为栈顶,同时定义一个变量 top 来记录栈顶元素在数组中的位置。

  • 栈的链式存储结构

单链表的尾部作为栈底,头部作为栈顶,方便插入和删除(进栈头插,出栈头删),头指针和栈顶指针 top 合二为一。


(2)栈的实现(顺序栈)

  • 顺序表的结构相比链表简单,不影响效率的情况下会优先使用顺序表。

  • 这次我们用的可动态增长的数组来实现的,因为栈只会在一端进行插入和删除操作,用数组效率还是比较高,当然,也会存在一些问题,就是每次空间不够,要重新开辟空间,可能会造成一些内存浪费。

首先新建一个工程( 博主使用的是 VS2019 )

  • Stack.h(栈的类型定义、接口函数声明、引用的头文件)
  • Stack.c(栈接口函数的实现)
  • Test.c(主函数、测试栈各个接口功能)

Stack.h 头文件代码如下:

#pragma once#include<stdio.h>   /*printf, perror*/
#include<assert.h>  /*assert*/
#include<stdlib.h>  /*realloc*/
#include<stdbool.h> /*bool*/typedef int STDataType;  //类型重命名,栈中元素类型先假设为inttypedef 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);
//检测栈是否为空,如果为空返回true,否则返回NULL
bool StackEmpty(Stack* ps);
//获取栈中有效元素个数
int StackSize(Stack* ps);
//获取栈顶元素
STDataType StackTop(Stack* ps);

这里重点讲解 Stack.c 中各个接口函数的实现

1)栈的定义

  • 下面是定长的静态栈的结构,实际中一般不实用,所以我们主要实现下面的支持动态增长的栈
typedef int STDataType;  //类型重命名,栈中元素类型先假设为int
#define N 20struct Stack
{STDataType a[N];  //定长数组int top;          //记录栈顶位置
}SqStack;
  • 支持动态增长的栈

假设栈的容量 capacity 为 5,定义空栈时 top = -1,当栈存在一个元素时 top = 0

typedef int STDataType;  //类型重命名,栈中元素类型先假设为inttypedef struct Stack
{STDataType* a;  //指向动态开辟的数组int top;        //记录栈顶位置int capacity;   //栈的容量大小
}Stack;

2)栈的初始化

//初始化栈
void StackInit(Stack* ps)
{assert(ps);ps->a = NULL;ps->top = -1;ps->capacity = 0;
}

3)栈的销毁

//销毁栈
void StackDestroy(Stack* ps)
{assert(ps);if (ps->a){free(ps->a);}ps->a = NULL;ps->top = -1;ps->capacity = 0;
}

4)入栈

//入栈
void StackPush(Stack* ps, STDataType x)
{assert(ps);if (ps->top == ps->capacity - 1)  //检查栈空间是否满了{//如果栈原始容量为0,新容量设为4,否则设为原始容量的2倍int newcapacity = (ps->capacity == 0) ? 4 : (ps->capacity) * 2;//扩容至新容量STDataType* temp = realloc(ps->a, newcapacity * sizeof(STDataType));if (temp == NULL){perror("realloc");exit(-1);}ps->a = temp;//更新容量ps->capacity = newcapacity;}ps->top++;           //栈顶指针加一ps->a[ps->top] = x;  //将新增元素放入栈顶空间
}

5)出栈

//出栈
void StackPop(Stack* ps)
{assert(ps);assert(ps->top != -1);  //栈不能为空ps->top--;  //栈顶指针减一
}

6)检测栈是否为空

//检测栈是否为空,如果为空返回true,否则返回NULL
bool StackEmpty(Stack* ps)
{assert(ps);return ps->top == -1;
}

7)获取栈中有效元素个数

//获取栈中有效元素个数
int StackSize(Stack* ps)
{assert(ps);return ps->top + 1;
}

8)获取栈顶元素

//获取栈顶元素
STDataType StackTop(Stack* ps)
{assert(ps);assert(!StackEmpty(ps));  //栈不能为空return ps->a[ps->top];
}

(3)测试栈的功能

  • 栈的实现,不能像顺序表一样,去实现一个打印函数来遍历栈并输出,这样就不符合栈的特点了(只能在栈顶插入删除,后进先出),所以我们这样来实现出栈:获取并打印栈顶元素,再删除栈顶元素,继续获取新的栈顶元素。
void TestStack()  //测试函数
{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);}printf("\n");//销毁栈StackDestroy(&s);
}
  • 运行结果


大家快去动手实现一下吧

【数据结构入门】栈(Stack)的实现(定义、销毁、入栈、出栈等) | 图解数据结构,超详细哦~相关推荐

  1. 给定入栈序列,判断一个串是否为出栈序列

    剑指offer22:给定入栈序列,判断一个串是否为出栈序列 public static boolean isOutStackSequence(int[] Spush, int[] Spop) {if ...

  2. 顺序栈初始化,判空,进栈,出栈,打印

    #include<iostream>#define maxSize 100 //后面没有分号 ; using namespace std;typedef struct //顺序栈的定义 { ...

  3. 立体视觉入门指南(3):相机标定之张式标定法【超详细值得收藏】

    亲爱的同学们,我们的世界是3D世界,我们的双眼能够观测三维信息,帮助我们感知距离,导航避障,从而翱翔于天地之间.而当今世界是智能化的世界,我们的科学家们探索各种机器智能技术,让机器能够拥有人类的三维感 ...

  4. 网络工程师入门必备「思科模拟器」实现交换机工作原理_5分钟学会!超详细实验配置解析~

    交换机: 再当今局域网中,交换机作为是作为最常见的以太网交换设备.大到服务器级华为思科交换机,小到十几块钱的塑料盒子.那么作为局域网中最常见的交换设备,它是如何进行工作的. 交换机的工作环境: 交换机 ...

  5. 【数据结构入门】队列(Queue)详解(定义、销毁、入队、出队等)| 图解数据结构,超详细哦~

    文章目录 (1)前言 1)队列的概念 2)队列的结构 (2)队列的实现(链式结构) 1)队列的定义 2)队列的初始化 3)队列的销毁 4)入队(尾插) 5)出队(头删) 6)获取队列元素个数 7)获取 ...

  6. python数据结构和算法 时间复杂度分析 乱序单词检测 线性数据结构 栈stack 字符匹配 表达式求值 queue队列 链表 递归 动态规划 排序和搜索 树 图

    python数据结构和算法 参考 本文github 计算机科学是解决问题的研究.计算机科学使用抽象作为表示过程和数据的工具.抽象的数据类型允许程序员通过隐藏数据的细节来管理问题领域的复杂性.Pytho ...

  7. 深入理解数据结构原理(1)—栈(Stack)

    目录 一.栈的定义 二.栈的基本操作 三.栈的实际操作 一.栈的定义 栈(Stack)是一种只允许在一端进行插入或者删除的操作的线性表.可以理解为一个桶里装进去的一层一层叠加压入进去的东西,栈的性质是 ...

  8. 数据结构基础:栈(Stack)

    什么是栈? 栈是限制插入和删除只能在同一个位置上进行的表,这个位置就是栈的顶端,对于栈的操作主要有三种形式:入栈(将元素插入到表中),出栈(将表最后的元素删除,也就是栈顶的元素),返回栈顶元素.栈有时 ...

  9. 【数据结构与算法】栈的基本运算(出栈、入栈、销毁栈等)及源码(顺序栈和链式栈)

    一.顺序栈 .h文件 #include <iostream> using namespace std;#define STACKSIZE 100 typedef int DataType; ...

最新文章

  1. 【组队学习】曹志宾:基于Python的会员数据化运营
  2. 2013\National _C_C++_A\4.约数倍数选卡片
  3. 使用WxPython进行Win32下Python编程
  4. mysql按 当前时间和规定时间大小排序_为什么 MySQL 使用 B+ 树· Why#x27;s THE Design?(009)...
  5. python最适合做什么-python适合做什么开发_python未来发展怎么样
  6. HDU 6162 2017 多校训练:Ch's gift(树链剖分)
  7. not in与NOT EXISTS亲历的差别体验
  8. 【Gym-101908 L】Subway Lines【树上两条路径交】
  9. iOS开发之仿照LinkedIn登录界面效果
  10. 【单片机开发】OV2640在没有DCMI接口的情况下的STM32驱动
  11. vga是计算机的什么接口,VGA/DVI/HDMI三种接口有什么区别?
  12. SRE学堂:OSS监控告警案例分析
  13. 有这两款手机拍照扫描软件,去哪都可以轻松使用
  14. 计算机的硬盘维修,计算机硬盘的维修方法和技巧
  15. 汉诺塔IV,汉诺塔V
  16. 非常适合新手使用的吉他调音软件!
  17. Weir Flow Control售予First Reserve事宜完成之后更名为Trillium Flow Technologies
  18. 怎么做视频剪辑,教你几招
  19. 【Android 】零基础到飞升 | AbsoluteLayout(绝对布局)
  20. 心灵鸡汤 - sixth (6th)

热门文章

  1. viewer图片查看器JQ版
  2. 11.jQuery遍历
  3. 华为p50 pro 鸿蒙,华为P50 Pro外观基本确认:居中开孔全面屏首发鸿蒙操作系统
  4. CSS弹性布局 Flex属性
  5. Python 集合函数
  6. EmbedKGQA论文简要解读
  7. 日课-5-29-曹全
  8. [Swift]LeetCode1025. 除数博弈 | Divisor Game
  9. 遥感学习笔记(一)——太阳辐射与大气作用
  10. VideoReTalking:用于野外会说话的头部视频编辑的基于音频的唇形同步