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语言实现(有详细注释讲解)相关推荐

  1. uboot 详细注释讲解

    转自:http://home.eeworld.com.cn/my/space-uid-135723-blogid-25548.html uboot 详细注释讲解 标签:  uboot  注释  讲解  ...

  2. 栈(Stack) C 语言实现

    栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元素放到栈 ...

  3. 栈(stack) C语言实现 详解

    2022/8/10 说明: 评论区有很多反对的声音, 有说我写错的, 有说我用了C++的, 大家可以自己多尝试下, 截至2022/8/10的反馈我都看过了, 目前都没问题. 2019/5/22 更新, ...

  4. 二叉树的非递归遍历算法C语言实现(详细注释版)

    二叉树的非递归算法遍历分为:先序遍历,中序遍历,后序遍历. 此文章我会根据先.中.后的顺序为大家用C语言实现全部代码. 顾名思义先序遍历是先遍历根节点,随后是左孩子,右孩子 . 中序遍历与后序遍历可以 ...

  5. c语言归并排序代码详细注释,C语言实现归并排序算法

    C语言实现归并排序算法 归并排序是创建在归并操作上的一种有效的排序算法.下面小编为大家整理了C语言实现归并排序算法,希望能帮到大家! 归并排序(Merge sort)是创建在归并操作上的一种有效的排序 ...

  6. c语言归并排序代码详细注释,C语言实现排序算法之归并排序详解

    排序算法中的归并排序(Merge Sort)是利用"归并"技术来进行排序.归并是指将若干个已排序的子文件合并成一个有序的文件. 一.实现原理: 1.算法基本思路 设两个有序的子文件 ...

  7. 单链表插入元素 注释 c语言,数据结构之无头单链表的相关练习题——C语言实现(详细注释)...

    本文中所用到的相关链表操作实现均在我上篇博客中:https://blog..net/haoziai905/article/details/87099287 1.删除无头单链表的非尾结点 这道题的重点就 ...

  8. 线性表之顺序表基本操作(C语言实现,详细注释版)

    有不懂的可以问我,把自己练习编写的代码在这里和大家分享下.如有错误欢迎指正. 编写不易,喜欢的话,点个赞吧

  9. 栈内存和堆内存Java(详细实例讲解)

    定义 栈内存:存放基本类型的变量.对象的引用(引用变量).(如何回收?) 在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间:当超过变量的作用域后,java会自动释放掉为该变量分配的 ...

最新文章

  1. MYSQL 数据库迁移 ***
  2. 04 - Object-C协议与代理设计
  3. word饼图如何画引导线_网络授课如何手写、标注?
  4. Nginx安装、配置及使用总结
  5. html中函数的意义,理解函数式 CSS
  6. python从入门到实践django看不懂_Python编程:从入门到实践踩坑记 Django
  7. Hibernate,JPA注解@Entity
  8. std::deque简单使用
  9. 微信测试环境下不能用window.open()
  10. 前端开发写代码哪个软件更好用?
  11. linux 分区100g整数,硬盘分区 整G 整数 法(从1g到200g最精确的整数分区)(转)...
  12. 一次帮妹子去水印经历<反编译DLL>
  13. Python抖音去水印_一步到位_一蓑烟雨任平生
  14. 文档自动同步云服务器,​文件自动同步网盘能实现吗?
  15. 360浏览器如何设置默认极速模式
  16. 关于在tomcat9中配置server.xml中URIEncoding=UTF-8无效的解决方法
  17. MFC中窗口实现拖拽文件功能
  18. 解决打不开 xxx.github.io的万能解决方法
  19. STM32使用寄存器点灯实验
  20. CSDN markdown icon 图标

热门文章

  1. idea 启动页图片更新2022.1以及2021
  2. linux修改ipaddr,并保存
  3. java获取百度网页内容
  4. 1. 有1,2,3,4个数字, 能组成多少个互不相同且无重复数字的三位数? 都是多少?
  5. (转载)JAVA小知识
  6. 43份ChatGTP报告分享
  7. 区块链软件公司:区块链到底能做啥?
  8. 信号量机制实现进程互斥与同步,生产者消费者
  9. 【Python】Python进程池multiprocessing.Pool八个函数对比:apply、apply_async、map、map_async、imap、starmap...
  10. [枚举]Stormwind 2022杭电多校第8场 1011