栈(stack)C语言实现(有详细注释讲解)
1. 什么是栈?
**堆栈(stack)**: 具有一定操作约束的线性表而用C语言实现栈,一共有三种方式:1. 用静态数组实现栈。2. 用动态数组实现栈。3. 用链表实现栈。
三种方法各有自己的优缺点,而在此篇文章中,我们用静态数组实现栈。即栈的长度已经是人为实现固定了的。
首先,我们要先导入所需的库:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
然后我们定义一个结构体用以存储栈里面的数据 data 和一个指向栈顶的标志 top:
#define MAXSIZE 128
typedef int elementType;
typedef struct SNode *Stack;
struct SNode{elementType data[MAXSIZE]; //声明一个静态数组,用于堆栈 int top; //标志栈顶
};
压数据入栈操作:(此处要先判断栈是否已满,如果满了就返回空)
void Push(Stack PtrS, elementType iterm){if(PtrS->top == MAXSIZE-1){ //栈堆满了printf("堆栈满了");return; }else{PtrS->data[++(PtrS->top)] = iterm;return;}
}
上面的这行代码:
PtrS->data[++(PtrS->top)] = iterm;
可以分开写成:
++(PtrS->top);PtrS->data[PtrS->top] = iterm;
意思都是一样的,就是先让指向原本栈顶的再向上挪一位,因为有新数据入栈。
下面是出栈操作:
elementType Pop(Stack PtrS){if(PtrS->top == -1){printf("堆栈空的");return 0;}else{return (PtrS->data[(PtrS->top)--]);}
}
此出栈函数和入栈差不多,开始要判断栈是不是为空。因为我们事先设定如果栈为空,top = -1 这个函数要返回一个数据,即我们想要弹出的数据,这里我们弹出的是elementType 即 int 类型。
下面是初始化一个栈的程序:
Stack InitStack(){Stack PtrS = (Stack)malloc(sizeof(struct SNode));PtrS->top = -1;return PtrS;
}
我们先要用 malloc 函数返回一个指向Stack类型(即struct SNode *)的地址空间,将地址赋给PtrS指针变量, 而且开始的时候我们要设置top = -1 然后返回这个指针。
接下来是主程序用于测试:
void main(){int n, m;Stack temp = InitStack();Push(temp, 12);Push(temp, 23);n = Pop(temp);m = Pop(temp);printf("%d\n",n);printf("%d\n",m);
}
先压入12 , 再压入23,然后弹出栈顶的数据(即23),再弹出一个数据(即12)。我们发现结果正确:
栈(stack)C语言实现(有详细注释讲解)相关推荐
- uboot 详细注释讲解
转自:http://home.eeworld.com.cn/my/space-uid-135723-blogid-25548.html uboot 详细注释讲解 标签: uboot 注释 讲解 ...
- 栈(Stack) C 语言实现
栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元素放到栈 ...
- 栈(stack) C语言实现 详解
2022/8/10 说明: 评论区有很多反对的声音, 有说我写错的, 有说我用了C++的, 大家可以自己多尝试下, 截至2022/8/10的反馈我都看过了, 目前都没问题. 2019/5/22 更新, ...
- 二叉树的非递归遍历算法C语言实现(详细注释版)
二叉树的非递归算法遍历分为:先序遍历,中序遍历,后序遍历. 此文章我会根据先.中.后的顺序为大家用C语言实现全部代码. 顾名思义先序遍历是先遍历根节点,随后是左孩子,右孩子 . 中序遍历与后序遍历可以 ...
- c语言归并排序代码详细注释,C语言实现归并排序算法
C语言实现归并排序算法 归并排序是创建在归并操作上的一种有效的排序算法.下面小编为大家整理了C语言实现归并排序算法,希望能帮到大家! 归并排序(Merge sort)是创建在归并操作上的一种有效的排序 ...
- c语言归并排序代码详细注释,C语言实现排序算法之归并排序详解
排序算法中的归并排序(Merge Sort)是利用"归并"技术来进行排序.归并是指将若干个已排序的子文件合并成一个有序的文件. 一.实现原理: 1.算法基本思路 设两个有序的子文件 ...
- 单链表插入元素 注释 c语言,数据结构之无头单链表的相关练习题——C语言实现(详细注释)...
本文中所用到的相关链表操作实现均在我上篇博客中:https://blog..net/haoziai905/article/details/87099287 1.删除无头单链表的非尾结点 这道题的重点就 ...
- 线性表之顺序表基本操作(C语言实现,详细注释版)
有不懂的可以问我,把自己练习编写的代码在这里和大家分享下.如有错误欢迎指正. 编写不易,喜欢的话,点个赞吧
- 栈内存和堆内存Java(详细实例讲解)
定义 栈内存:存放基本类型的变量.对象的引用(引用变量).(如何回收?) 在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间:当超过变量的作用域后,java会自动释放掉为该变量分配的 ...
最新文章
- MYSQL 数据库迁移 ***
- 04 - Object-C协议与代理设计
- word饼图如何画引导线_网络授课如何手写、标注?
- Nginx安装、配置及使用总结
- html中函数的意义,理解函数式 CSS
- python从入门到实践django看不懂_Python编程:从入门到实践踩坑记 Django
- Hibernate,JPA注解@Entity
- std::deque简单使用
- 微信测试环境下不能用window.open()
- 前端开发写代码哪个软件更好用?
- linux 分区100g整数,硬盘分区 整G 整数 法(从1g到200g最精确的整数分区)(转)...
- 一次帮妹子去水印经历<反编译DLL>
- Python抖音去水印_一步到位_一蓑烟雨任平生
- 文档自动同步云服务器,​文件自动同步网盘能实现吗?
- 360浏览器如何设置默认极速模式
- 关于在tomcat9中配置server.xml中URIEncoding=UTF-8无效的解决方法
- MFC中窗口实现拖拽文件功能
- 解决打不开 xxx.github.io的万能解决方法
- STM32使用寄存器点灯实验
- CSDN markdown icon 图标
热门文章
- idea 启动页图片更新2022.1以及2021
- linux修改ipaddr,并保存
- java获取百度网页内容
- 1. 有1,2,3,4个数字, 能组成多少个互不相同且无重复数字的三位数? 都是多少?
- (转载)JAVA小知识
- 43份ChatGTP报告分享
- 区块链软件公司:区块链到底能做啥?
- 信号量机制实现进程互斥与同步,生产者消费者
- 【Python】Python进程池multiprocessing.Pool八个函数对比:apply、apply_async、map、map_async、imap、starmap...
- [枚举]Stormwind 2022杭电多校第8场 1011