目录

概念

思路和源代码

思路

源代码

头文件(主题框架)

源文件,各个接口的实现

结构体的初始化

压栈

出栈

判断是否为空

获取栈顶元素

获取元素个数

销毁

test.c源文件(main函数所在的.c源文件)

Stack.c各个接口的实现源文件的整合


概念

栈是一种特殊的线性表,遵循先进后出(后进先出)的原则,只允许在固定的一端进行插入和删除,而这一端称为栈顶,另一端称为栈底

压栈:插入元素到栈顶,也称进栈、入栈

出栈:删除元素在栈顶。

注:操作系统的栈与数据结构的栈不同,但是都是后进先出,比如操作系统的栈后开辟的栈区先释放

思路和源代码

思路

顺序表比链表更容易操作尾插尾删,并且顺序表可以随机访问,开辟和释放内存也是更适合栈的实现,所以栈的实现是利用顺序表来实现的,即数组,malloc或realloc开辟的连续的空间。

栈的操作是在栈顶,所以我们实现接口也是着重实现栈顶元素的删除(出栈),在栈顶加载上元素(压栈),获取栈顶的元素,其余就是初始化栈、获取元素的个数、顺序表是否为空(空会影响到压栈和出栈,压栈是否需要扩容,出栈判断元素为空时断言防止越界访问)、顺序表的销毁这些接口的实现。

源代码

头文件(主题框架)

#include <stdio.h>
#include <stdlib.h>/*realloc,free*/
#include <assert.h>/*assert*/
#include <stdbool.h>/*bool*/
typedef int DataType;
typedef struct Stack
{DataType* a;/*动态内存开辟的顺序表*/int capicity;/*容量*/int top;/*栈顶下标+1*/
}ST;
/*初始化*/
void StackInit(ST* ps);
/*销毁*/
void Destroy(ST* ps);
/*压栈*/
void StackPush(ST* ps, DataType x);
/*出栈*/
void StackPop(ST* ps);
/*判断是否为空*/
bool StackEmpty(ST* ps);
/*栈顶元素*/
DataType StackTop(ST* s);
/*元素个数*/
int StackSize(ST* ps);

源文件,各个接口的实现

结构体的初始化

/*初始化*/
void StackInit(ST* ps)
{assert(ps);ps->a = NULL;ps->top = ps->capicity = 0;
}

压栈

/*压栈*/
void StackPush(ST* ps,DataType x)
{assert(ps);if (ps->top == ps->capicity)/*空间满或未开辟空间*/{int newcapicity = ps->capicity == 0 ? 4 : ps->capicity * 2;/*重新开辟空间,原来的2倍最好*/DataType* ptr = (DataType*)realloc(ps->a, sizeof(DataType) * newcapicity);if (ptr == NULL){perror("realloc fail");exit(-1);}ps->a = ptr;ps->capicity = newcapicity;/*栈顶不变,容量变*/}ps->a[ps->top] = x;++ps->top;
}

出栈

/*出栈*/
void StackPop(ST* ps)
{assert(ps);assert(!StackEmpty(ps));/*防止越界访问*/--ps->top;
}

判断是否为空

/*判断是否为空*/
bool StackEmpty(ST* ps)/*传指针是因为如果传值,临时变量还需要耗费一定的空间*/
{assert(ps);return ps->top == 0;
}

获取栈顶元素

/*栈顶元素*/
DataType StackTop(ST* ps)
{assert(ps);assert(!StackEmpty(ps));/*空为真,不断言,所以反逻辑后的断言*/return ps->a[ps->top-1];/*top代表着栈顶的元素+1.比如top初始化为0,第一次压栈后top就从0变成了1*/
}

获取元素个数

/*元素个数*/
int StackSize(ST* ps)
{assert(ps);return ps->top;
}

销毁

void StackDestroy(ST* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->capacity = ps->top = 0;
}

test.c源文件(main函数所在的.c源文件)

#include "stack.h"
void test()
{ST st;StackInit(&st);StackPush(&st, 1);StackPush(&st, 2);StackPush(&st, 3);printf("%d ", StackTop(&st));StackPop(&st);printf("%d ", StackTop(&st));StackPop(&st);StackPush(&st, 4);StackPush(&st, 5);while (!StackEmpty(&st)){printf("%d ", StackTop(&st));StackPop(&st);}printf("\n");Destroy(&st);
}
int main()
{test();return 0;
}

Stack.c各个接口的实现源文件的整合

#include "stack.h"
/*初始化*/
void StackInit(ST* ps)
{assert(ps);ps->a = NULL;ps->top = ps->capicity = 0;
}
/*销毁*/
void Destroy(ST* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->top = ps->capicity = 0;
}
/*压栈*/
void StackPush(ST* ps,DataType x)
{assert(ps);if (ps->top == ps->capicity)/*空间满或未开辟空间*/{int newcapicity = ps->capicity == 0 ? 4 : ps->capicity * 2;/*重新开辟空间,原来的2倍最好*/DataType* ptr = (DataType*)realloc(ps->a, sizeof(DataType) * newcapicity);if (ptr == NULL){perror("realloc fail");exit(-1);}ps->a = ptr;ps->capicity = newcapicity;/*栈顶不变,容量变*/}ps->a[ps->top] = x;++ps->top;
}
/*出栈*/
void StackPop(ST* ps)
{assert(ps);assert(!StackEmpty(ps));/*防止越界访问*/--ps->top;
}
/*判断是否为空*/
bool StackEmpty(ST* ps)/*传指针是因为如果传值,临时变量还需要耗费一定的空间*/
{assert(ps);return ps->top == 0;
}
/*栈顶元素*/
DataType StackTop(ST* ps)
{assert(ps);assert(!StackEmpty(ps));/*空为真,不断言,所以反逻辑后的断言*/return ps->a[ps->top-1];/*top代表着栈顶的元素+1.比如top初始化为0,第一次压栈后top就从0变成了1*/
}
/*元素个数*/
int StackSize(ST* ps)
{assert(ps);return ps->top;
}

《数据结构C语言版》-栈的概念和栈的实现相关推荐

  1. 【数据结构 C语言版】第六篇 栈、队列经典必刷面试考研题

    [数据结构 C语言版]第六篇 栈.队列经典必刷面试考研题 写在前面 更新情况记录: 最近更新时间 更新次数 2022/10/20 1 参考博客与书籍以及链接: (非常感谢这些博主们的文章,将我的一些疑 ...

  2. c语言动态双端栈的原理,数据结构(C语言版)例题(第三章:栈和队列)

    数据结构(C语言版)例题(第三章:栈和队列) 数据结构(C语言版)例题(第三章:栈和队列) (2008-05-09 12:33:13) 转载▼ ◆3.15③ 假设以顺序存储结构实现一个双向栈,即在一维 ...

  3. 为什么C语言是非形式化的,《数据结构C语言版》——绪论

    <数据结构C语言版>--绪论<笔记> 一.基本概念和术语 1.数据,数据元素, 数据项,数据对象 数据:是客观事物的符号表示,是所有能够输入到计算机中并被计算机程序处理的符号的 ...

  4. 数据结构c语言版第16页,数据结构c语言版

    数据结构c语言版[编辑] 概述 <数据结构C语言版>本书的前半部分从抽象数据类型的角度讨论各种基本类型的数据结构及其应用;后半部分主要讨论查找和排序的各种实现方法及综合分析比较 出版信息 ...

  5. 数据结构c语言版朱战立报告,数据结构(C语言版)

    本书是Sedgewick彻底修订和重写的C算法系列的第一本.全书分为四部分,共16章.第一部分"基础知识"(第1-2章)介绍基本算法分析原理.第二部分"数据结构" ...

  6. 数据结构c语言版习题

    数据结构c语言版习题 文章目录 第一章 绪论 第二章 线性表 第四章 串 第五章数组和广义表作业 第六章 树与二叉树理论作业 第七章图作业 第八章查找作业 第一章 绪论 一.选择题 1.以下说法正确的 ...

  7. 数据结构C语言版字符串,数据结构c语言版

    数据结构c语言版是一款非常使用的数据结构课程的编写和教材:它也可将软件作为学习数据结构.算法C程序设计的参数教材,只需要用户学习该软件之后,就算遇到在繁杂的代码也可以清晰的写出来,本书的钱半部分主要介 ...

  8. c语言数据结构考研试题,数据结构C语言版考研复习题.doc

    数据结构C语言版考研复习题 第一章 绪论1.1 简述下列概念:数据.数据元素.数据类型.数据结构.逻辑结构.存储结构.线性结构.非线性结构.1. 常用的存储表示方法有哪几种? 1. 算法的时间复杂度仅 ...

  9. <排序>《数据结构(C语言版)》

    目录 <数据结构(C语言版)>之排序实现 --By 作者:新晓·故知 排序性能测试对比: 1.排序的概念及其运用 1.1排序的概念 1.2排序运用 1.3 常见的排序算法 2.常见排序算法 ...

  10. 《数据结构(c语言版)》 作者 唐国民,王国钧 pdf,王国钧

    ¥17.60定价:¥28.00(6.29折) /2018-07-01 本书是为数据结构课程编写的教材,也可以作为学习数据结构及其算法的C语言程序设计的参考书.本书系统地介绍了各种常用的数据结构与算法方 ...

最新文章

  1. 粘贴铜箔简易实验电路制作
  2. OpenCV SFM模块安装
  3. async 和 await 之异步编程的学习
  4. 从零开始学Pytorch(十一)之ModernRNN
  5. mysql中join操作_Mysql中的join操作
  6. 本人账户登录计算机黑屏,电脑开机输入系统密码后就黑屏了,怎么办
  7. nginx重启后出现[error] open() “/usr/local/var/run/nginx/nginx.pid” failed
  8. html表格序号自动增加
  9. PIL Image P和L模式
  10. php的seeder是什么,轻松学Laravel6数据填充之方式一Seeder填充
  11. Python将经纬度数据转换成浮点数据
  12. Nagios nsca插件进程突然死掉
  13. 螺栓扭矩查找表excel下载
  14. html5一键打包成苹果软件,GDB苹果网页一键打包工具如何使用?GDB苹果网页一键打包工具安装使用教程...
  15. kubernetes集群环境搭建(kubeadm方式)
  16. asp mysql查询_asp的 条件查询
  17. 如何点亮一盏LED灯
  18. 哀嚎遍野!学妹跟学弟分手了,因为JavaEE期末课设SSM太难了!呜呼哀哉!
  19. 如何撰写数据运营分析报告
  20. matlab计算离散卷积

热门文章

  1. 洛谷 P1460 健康的荷斯坦奶牛 Healthy Holsteins
  2. Win10占用电脑内存过高
  3. MySQL5.7 固态盘性能设置_MySQL 5.7 安装完成后,立即要调整的性能选项
  4. MES系统中常见的数据采集方法
  5. 长城信息IPO过会:年营收13.4亿 中国电子控制77%股权
  6. jQuery中的end()方法使用介绍
  7. JS事件绑定的几种方式
  8. RTSP拉流h265(hevc)+AAC关键节点详解!史上最全RTSP+hevc 交互全记录!
  9. Qt窗口之间传值和结构体数据
  10. 什么是基于web开发,CSS的浮动属性,干货满满!