【 C 】经典抽象数据类型(ADT)之堆栈(用静态数组实现堆栈)
堆栈简介
堆栈(stack)最鲜明的特点就是后进先出(Last-In First-Out,LIFO)的数据进出方式。
基本的堆栈操作通常被称为 push 和 pop。push就是将一个新值压入到堆栈的顶部, pop就是把堆栈顶部的值移出堆栈并返回这个值。堆栈只提供对它的顶部值的访问。
传统的堆栈接口中,访问顶部元素的唯一方法就是把它移除。另一类堆栈接口提供三种基本的操作:push,pop,top。push和前面所说的一样,把一个新值压入堆栈的顶部,pop有点不一样的是只把顶部元素从堆栈中移除,并不返回这个值。top返回顶部元素的值,但它并不把顶部元素从堆栈中移除。下面统统采用这种方式!
我们需要两个额外的函数来使用堆栈。一个空堆栈不能执行pop操作,所以我们需要一个函数告诉我们堆栈是否为空。在实现堆栈时,如果存在最大长度限制,那么我们也需要另一个函数告诉我们堆栈是否已满。
这里提前说一下,这两个函数一个是判断堆栈是否已空的函数(is_empty),如果堆栈为空,返回TRUE,否则返回FALSE;另一个是判断堆栈是否已满的函数(is_full),如果已满,返回TRUE,否则返回FALSE。
在真正的堆栈实现中,这两个函数需要配合assert宏使用,后面你就将看到,关于assert宏的基础知识,见博文:【 C 】assert.h 简明介绍
如果不了解什么是宏,可以参考博文:【 C 】宏 简记
堆栈接口
什么是堆栈接口,实际上就是一个头文件,声明了堆栈的一些操作,包含堆栈需要使用的函数的一些原型!
堆栈是最容易实现的ADT之一。它的基本方法是当值被push到堆栈时把它们存储于数组中连续的位置上。你必须记住最近一个被push的值的下标。如果需要执行pop操作,你只需要简单地减少这个下标值就好了。
下面的头文件描述了一个堆栈模块的非传统接口:
//一个堆栈模块的接口#define STACK_TYPE int //堆栈所存储值的类型//push
//把一个新值压入到堆栈中,它的参数是需要被压入的值。
void push( STACK_TYPE value );//pop
//从堆栈弹出一个值,并将其丢弃
void pop( void );// is_empty
// 如果堆栈为空,返回TRUE,否则返回FALSEint is_empty( void );// is_full
// 如果堆栈已满,返回TRUE,否则返回FALSE
int is_full( void );
保存为:stack.h
注意堆栈接口只包含了用户使用堆栈所需要的信息,特别是它并没有展示堆栈的实现方式。事实上,对这个头文件稍作修改,它可以用于三种实现方式。用这种方式定义接口是一种好方法,因为它防止用户以为它依赖于某种特定的实现方式。
具体实现方式后面会一一道来。
这个接口的一个有趣的特征就是存储于堆栈中的值的类型的声明方式。在编译这个堆栈模块之前,用户可以修改这个类型以适合自己的需要。例如上面声明为:#define STACK_TYPE int //堆栈所存储值的类型
实现堆栈
用静态数组实现堆栈
//用静态数组实现堆栈,数组的长度只能通过修改#define定义
//并对模块重新编译来实现
#include <assert.h>
#include "stack.h"#define STACK_SIZE 100 //堆栈中值数量的最大限制//定义堆栈数组和栈顶下标
static STACK_TYPE stack[STACK_SIZE];
static int top_element = -1;//push
void push( STACK_TYPE value )
{assert( !is_full() ); //判断堆栈是否已经满了,未满则继续执行,否则退出top_element += 1;stack[ top_element ] = value;
}//pop
void pop( void )
{assert( !is_empty() ); //判断堆栈是否是空的,如果不是,则继续执行,否则退出top_element -= 1;
}//top
STACK_TYPE top( void )
{assert( !is_empty() ); //堆栈未空,则继续return stack[ top_element ];
}//is_empty
int is_empty( void )
{return top_element == -1; //堆栈为空,则返回TRUE,否则返回FALSE
}//is_full
int is_full( void )
{return top_element == STACK_SIZE - 1; //堆栈已满,返回TRUE,否则返回FALSE
}
变量top_element保持堆栈顶部元素的下标值。它的初始值为-1,提示堆栈为空。push函数在存储新元素之前先增加这个变量的值,这样top_element始终包含顶部元素的下标值。
这个堆栈模块的一个值得注意的特性就是它使用assert宏来防止非法操作,诸如从一个空堆栈中弹出一个元素或者从一个已满堆栈中压入元素。这个断言调用is_full和is_empty函数,而不是测试top_element本身。如果你以后决定使用不同的方法来检测空堆栈或者满堆栈,使用这种方法显然要容易很多。
对于用户无法消除的错误,使用断言是很合适的。
下篇博文再说用动态数组实现堆栈以及使用链式结构实现堆栈!
【 C 】经典抽象数据类型(ADT)之堆栈(用静态数组实现堆栈)相关推荐
- [C和指针] ch17. 经典抽象数据类型
第十七章:经典抽象数据类型 Github 链接:ch17. 经典抽象数据类型 抽象数据类型 (ADT) 是非常常用的,最为常见的就是数组.顺序表.链表.栈和队列等等.诸如 OS 内部的任务调度有队列. ...
- 抽象数据类型与计算机内部表示和实现无关,第七话:抽象数据类型ADT
我们对已有的数据类型进行抽象,就有了抽象数据类型. 抽象数据类型(Abstract Date Type, ADT):是指一个数学模型及定义在该模型上的一组操作.抽象数据类型的定义仅取决于它的一组逻辑特 ...
- c语言写报告抽象数据类型,C语言抽象数据类型ADT
根据编程的问题匹配合适的数据类型.数据项连接构成了链表,定义了一个结构代表单独的项.设计了一些方法把一系列结构构成一个链表.本质上,我们使用C语言的功能设计了一种符合程序要求的新的数据类型.但是上述的 ...
- 抽象数据类型 ADT
5. 抽象数据类型(ADT) 抽象数据类型 (ADT,Abstract Data Type)是指一个 数学模型 以及定义在此数学模型上的一组操作. 它通常是对数据的某种抽象,定义了数据的 取值范围 及 ...
- 【 C 】经典抽象数据类型(ADT)之内存分配
C中的一些抽象数据类型(ADT)如链表.堆栈.队列和树等,链表已经在前几篇博文有所讨论,见: [ C ]在单链表中插入一个新节点的尝试(一) [ C ]在单链表中插入一个新节点的尝试(二) [ C ] ...
- 抽象数据类型 (ADT)
一.Abstraction and User-Defined Types 抽象数据类型与表示独立性:能够分离程序中数据结构的形式和对其使用的方式 ADT的特性:不变量.表示泄漏.抽象函数AF.表示不变 ...
- C的指针疑惑:C和指针17(经典抽象数据类型)
堆栈这种数据最鲜明的特点是:后进先出. 用动态数组实现堆栈: #include "C17.h" #include <stdio.h> #include <stdl ...
- 《C和指针》笔记(十四)-- 经典抽象数据类型
C/C++ 笔记 QQ : 1841545843 邮箱 : jiaxx903@163.com 一. 堆栈 /* ** 堆栈模拟接口 */#define STACK_TYPE int// push vo ...
- 复数抽象数据类型C语言,采用C/C++语言如何实现复数抽象数据类型Complex
记录一下! 采用C/C++语言如何实现复数抽象数据类型Complex #include typedef struct Complex { double e1; // 实部 double e2; // ...
最新文章
- Linux kmap和kmap_atomic解析
- Sourcing Cockpit: 2. Demo of Service Purchase Order
- oracle数据库查看用户相关语句
- Asterisk 学习进阶 2
- linux 添加新用户时常用的操作
- 适配器模式之享元模式
- Linux设备驱动程序和设备文件
- union并不绝对比or的执行效率高
- Python第八课:函数(def)
- python中print输出变量_python中如何使用print函数?
- 苹果8的爆料这么多?为什么...
- vue3.2中ref高效的秘密:依赖收集错级位运算操作(bit/dep.w/dep.n)
- 冒志鸿:没有对比就没有伤害,原来中国的区块链这么……
- xcode结果边栏_XCode属性面板使用说明
- java分页实现(一)
- linux下挂载硬盘!
- LabVIEW基础-定时
- uebs游戏_UEBS Ultimate Epic Battle下载
- 制作网上投票链接制作可以投票的链接制作制作一个投票链接
- 打破企业多年来面临的数据困境,这款BI工具做到了
热门文章
- 局域网组建与维护(1)
- mysql错误代码1045的解决方案_mysql错误代码1045的解决方案
- 函数计算的是什么_【Excel函数教程】3个例子让你彻底玩转EDATE函数
- 织梦同步静态文件到服务器,静态网站添加到织梦
- 虚幻4皮肤材质_虚幻周报20200721 | CJ就要开始啦~
- 三维动画属于计算机专业吗,三维动画设计专业属于文科还是理科
- java 获取第一帧_java获取视频的第一帧
- 关于第十六届大学生智能汽车竞赛 华南赛区补赛办法
- 2021年春季学期教学记录
- 海军工程大学学生电子课程-DIY Final预验收