目录

1.摘要
2.引子
3.什么是栈?
4.栈的代码实现
    4.1.用顺序表实现栈
    4.2.头文件
    4.3.接口文件
    4.4.测试文件
5.参考文献

1.摘要

本文主要介绍栈的结构以及栈的代码实现。

2.引子

相必在座的军迷朋友一定不少吧,哈哈,实不相瞒,我也是一个轻武器的铁杆军迷。

如果提到手枪,那么不得不提的就是格洛克了。简洁的外观搭配强大的火力,在军用民用市场广受追捧。

那么大家是否见过往弹匣压子弹呢?对了对了,就是一发一发地把子弹压入弹仓

不对啊不对啊,我们今天不是来研究栈这个数据结构的吗?怎么扯得这么远了?
别急别急,待会你就知道为什么要讲这个例子了。

3.什么是栈?

和之前讲的顺序表和链表一样,栈也是线性表的一种,只不过,栈遵循的规则比起顺序表、链表来严格了一点

让我们给出栈的定义:栈是满足后进先出(Last in First out,LIFO)规则的线性表,只允许在固定的一端进行插入和删除操作。进行插入删除操作的一端叫做栈顶,另一端叫做栈底。

压栈操作:栈的插入操作叫做进栈/压栈/入栈,数据入栈在栈顶。
出栈操作:栈的删除操作叫做出栈。数据出栈也在栈顶。

下图清楚地展示了什么是入栈/出栈:


入栈和出栈:



多组数据的入栈和出栈:

当然了,顺便提一句,压栈操作的英文是Push,出栈操作的英文是Pop

只要牢牢记住后进先出的原则,即第一个进栈的数据最后一个才能出来,那么栈的性质就十分通透了。

还记得之前的给弹匣压弹吗?有没有一点感觉呢现在?
对了,第一发压进去的子弹最后才能射出来,最后压进去的子弹第一发就能射出来!这难道不是后进先出吗?

回顾一下开篇的那张压子弹图片,这难道不是压栈操作吗:

再来看一看子弹上膛的情景,这难道不是出栈操作吗:

后进先出!后进先出!后进先出!重要的事情说三遍!

4.栈的代码实现

4.1.用顺序表实现栈

由于栈是一类特殊的线性表,所以栈既可以用顺序表实现,也可以用链表来实现。

经过考虑,由于栈的操作通常是在栈顶完成,而通常线性表头我们认为是栈底,而线性表尾我们认为是栈顶,所以为了方便在线性表尾进行操作,本次我们采用动态开辟数组的方式来实现栈,尾部操作的时间复杂度华仅为O(1)。

当然,如果使用双向链表,也是很方便的,但是非循环单链表进行尾部操作需要遍历,时间复杂度华为O(N),不是很划算。

4.2.头文件

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h># define INIT_NUM 4
typedef int StackDataType;
typedef struct Stack {StackDataType* data;size_t size;size_t capacity;
}Stack;void StackInit(Stack* ps);
void StackDestroy(Stack* ps);
void StackPush(Stack* ps, StackDataType x);
void StackPop(Stack* ps);
int StackEmpty(Stack* ps);
size_t StackSize(const Stack* ps);
StackDataType StackTop(const Stack* ps);

4.3.接口文件

我们尤其强调以下四个接口:

// 1.压栈
void StackPush(Stack* ps, StackDataType x);// 2.出栈
void StackPop(Stack* ps);// 3.判空,栈为空返回1,非空返回0
int StackEmpty(Stack* ps);//取栈顶元素
StackDataType StackTop(const Stack* ps);

以下是接口文件的实现:

void StackBuy(Stack* ps)
{assert(ps);ps->capacity = ps->capacity == 0 ? INIT_NUM : 2 * ps->capacity;StackDataType* tmp = (StackDataType*)realloc(ps->data, ps->capacity * sizeof(StackDataType));if (tmp == NULL){printf("realloc failed\n");return;}ps->data = tmp;
}void StackCheck(Stack* ps)
{assert(ps);if (ps->capacity == ps->size){StackBuy(ps);}
}
void StackInit(Stack* ps)
{assert(ps);ps->capacity = 0;ps->size = 0;ps->data = NULL;StackBuy(ps);
}void StackDestroy(Stack* ps)
{assert(ps);ps->capacity = 0;ps->size = 0;free(ps->data);ps->data = NULL;
}void StackPush(Stack* ps, StackDataType x)
{assert(ps);StackCheck(ps);ps->data[ps->size] = x;ps->size++;
}void StackPrint(const Stack* ps)
{assert(ps);int i = 0;for (i = 0; i < ps->size; i++){printf("%d ", ps->data[i]);}printf("\n");
}void StackPop(Stack* ps)
{assert(ps);if (ps->size == 0)return;else--ps->size;
}int StackEmpty(Stack* ps)
{return ps->size == 0;
}size_t StackSize(const Stack* ps)
{return ps->size;
}StackDataType StackTop(const Stack* ps)
{assert(ps);assert(StackEmpty(ps));return ps->data[ps->size - 1];
}

4.4.测试文件

Test1()
{Stack st;Stack* pstack = &st;StackInit(pstack);StackPush(pstack, 1);StackPush(pstack, 2);StackPush(pstack, 3);StackPush(pstack, 4);StackPop(pstack);StackPop(pstack);StackPop(pstack);StackPop(pstack);printf("%d\n", StackEmpty(pstack));printf("%d\n", StackSize(pstack));StackDestroy(pstack);}
int main()
{Test1();return 0;
}

5.参考文献

1.压栈
2.出栈

【数据结构】格洛克怎么上膛?栈的结构帮你解答!相关推荐

  1. 【数据结构(郝斌)】03线性结构-栈

    数据结构-栈 什么是栈 静态栈 动态栈 区别: 静态栈 动态栈 操作 栈的标准库操作 动态栈的操作实现 操作 void initStack(PSTACK s) void pushStack(PSTAC ...

  2. 【Python数据结构系列】❤️《栈(顺序栈与链栈)》——❤️知识点讲解+代码实现

    灵魂拷问:为什么要学数据结构? 数据结构,直白地理解,就是研究数据的存储方式.数据存储只有一个目的,即为了方便后期对数据的再利用.因此,数据在计算机存储空间的存放,决不是胡乱的,这就要求我们选择一种好 ...

  3. 数据结构,堆和栈和队列的概念

    数据结构,堆和栈和队列的概念 1 什么是数据结构 数据结构是计算机存储,组织数据的反复改.数据结构是指相互之间存在的一种或多种特定关系的数据元素集合. 2 数据结构的逻辑结构 1 集合结构,元素都是孤 ...

  4. java虚拟机栈帧_Java虚拟机,运行时栈帧结构

    业余生活要有意义,不要越轨.--华盛顿 引导语 "虚拟机"是一个相对于"物理机"的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器. ...

  5. java stack 从1.5开始?_java数据结构与算法之栈(Stack)设计与实现

    本篇是java数据结构与算法的第4篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 栈是一种用于存储数据的简单数据结构,有点类似链表或者顺序表(统称线性表),栈与线 ...

  6. c语言用两个栈构造队列伪码,数据结构习题线性表栈队列.doc

    数据结构习题线性表栈队列 线性表(58) 1. 在单链表.双链表和单循环链表中,若仅知道指针p指向某结点,不知道头指针,能否将结点*p从相应的链表中删去?若可以,其时间复杂度各为多少? 2.设线性表的 ...

  7. 《大话数据结构》读书笔记-栈与队列

    写在前面:本文仅供个人学习使用.<大话数据结构>通俗易懂,适合整体做笔记输出,构建体系.并且文中很多图片来源于该书. 文章目录 4.2栈的定义 4.2.1 栈的定义 4.2.2 进栈出栈变 ...

  8. 什么是栈,栈存储结构详情

    什么是栈,栈存储结构详情 同顺序表和链表一样,栈也是用来存储逻辑关系为一对一数据的线性存储结构,如图所示: 从图1我们看到,栈存储结构与之前学的线性存储有所差异,这源于栈对数存和取的过程有特殊的要求: ...

  9. 数据结构与算法(2)——栈和队列

    前言:题图无关,只是好看,接下来就来复习一下栈和队列的相关知识 前序文章: 数据结构与算法(1)--数组与链表(https://www.jianshu.com/p/7b93b3570875) 栈 什么 ...

最新文章

  1. 贵州高二会考计算机考试题,20167月贵州普通高中学业水平考试会考试题
  2. 每日一道面试题(第7期)---Android补间动画与属性动画的区别
  3. Java中List.remove报UnsupportedOperationException异常
  4. Java Fork/Join 框架
  5. poco c++ 开发指南_掌握这个框架,你将会开发通杀全平台的万能爬虫
  6. spark学习-70-源代码:Endpoint模型介绍(2)-启动流程
  7. Git撤销之世上真有后悔药
  8. python 计算曲线面积_微积分到底有多神?能完成多少不可思议,难以测量的计算?他简直强大的让人害怕!...
  9. 企业数据可视化大屏的三大优势
  10. NBA球队实力聚类分析
  11. 打通WordPress和微信公众号
  12. 微信PC端网站 微信扫码登陆
  13. 2021-08-10 VS2019 MFC
  14. 软件工程 sdlcmodel
  15. 用计算机华为隐藏空间,真香,华为手机开启隐私空间双系统,一部手机当两部用...
  16. 什么是过拟合?过拟合的10个解决办法都有哪些?
  17. 全国外语水平考试(WSK)
  18. 如何在html中选择wrap,jQuery wrap()方法怎么用?
  19. java微信小程序、APP 西门子PLC通信,java S7-S200、java S7-300、java S7-400,java与PROFINET协议通信 Java与西门子PLC通信
  20. 用XAMPP搭建本地:Web服务器,访问服务器,下载服务器。

热门文章

  1. 微信营销有哪些精准吸粉的方法?
  2. ZCMU 1919: kirito's 星爆气流斩(多重背包+二进制优化)
  3. IMX6Q安卓解开温度墙,设置高性能模式
  4. 月薪9K程序员,写完这段代码就被辞退了
  5. USB 3.0规范中译本 第2章 术语及缩略语
  6. 关于基础知识的思考 (摘自自己对某位仁兄的顶贴)
  7. JS ListBox动态加载数据
  8. 生产环境Centos LNMP编译安装nginx-1.6 MySQL-5.6 php-5.5
  9. 香港虚拟主机与国内虚拟主机区别
  10. Java基础知识与集合部分面试题整理