不完全类型和抽象数据类型的定义
data和记录数组元素个数的值numData存储栈的最大容量,以及记录栈顶元素的位置top进行打包,将栈的数据结构隐藏在".c"文件中。即:
对于用户来说,现在只能通过".h"文件中的接口操作栈。尽管此时还没有定义stackCDT,由于指针的大小始终相同,且不依赖于它指向的对象。即便在不知道结构体本身细节的前提下,编译器同样允许处理指向结构体的指针,因此可以定义一个指针类型引用不完全类型,将stackADT定义为一个指向stackCDT *结构体类型。比如:
虽然这个结构是一个不完全类型,但在实现栈的文件中信息变得完整,因此该结构的成员依赖于栈的实现方法。stackADT结构体类型的变量定义如下:
由于一个stack1指向一个存储单元,即一个存储单元代表一个栈,因此你想要多少个栈就有多少个栈。比如:
显而易见,stackADT是代表stack1、stack2、stack3等所有具体栈的总称的抽象数据类型,stack1、stack2和stack3分别指向不同的栈。因此只要将stack1、stack2和stack3作为实参传递给相应的函数,即可访问与之相应的栈。而抽象的方法是在栈的实现代码和使用栈的代码之间添加一个函数层。比如:
通常将称为函数上下文的stackADT类型的stack作为函数的第一个参数,这个参数就是函数将要操作的对象。它代表指向当前对象(栈)的指针,用于请求对象对自身执行某些操作。而结构体的成员变量就是通过stack指针找到自己所属的对象的,其引用方式如下:
由此可见,用户仅通过接口函数与栈交互,而不是直接访问它的数据。
(2)操作方法
-
创建栈
由于用户完全不知道底层是如何表示的,因此必须提供一个用于创建一个新stackADT的函数,且将它返回给用户。用于创建一个新的抽象类型的值的函数名称以new开始,以强调动态分配。其函数原型如下:
前置条件:stackADT被定义为一个指向结构体的指针,该结构体包含top和numData。一旦知道最大容量,则该栈即可被动态确定。创建一个具有给定最大值MAXSIZE的栈,其分别是为stackCDT结构体分配空间和长度为MAXSIZE的数组分配空间。同时将top初始化为0,并将numData置为最大值MAXSIZE。
后置条件:返回栈。
其调用形式如下:
-
销毁栈
当接口定义了一个分配新的抽象类型的值的函数时,通常还要为接口提供一个用于释放用户不再使用的栈的动态内存的函数。其函数原型如下:
前置条件:stack指向之前创建的栈;
后置条件:释放动态分配的所有内存,即先释放栈的数组,然后释放栈的结构。
其调用形式如下:
-
从栈顶添加据(进栈)
当用户向栈顶添加一个数据时,就是将该值存储在内部的数据结构中。即通过在容器的顶端插入元素实现push,其函数原型如下:
前置条件:stack指向之前创建的栈,value是待压入栈顶的数据;
后置条件:如果栈不满,将value放在栈顶,该函数返回true,否则栈不变,该函数返回false。
其调用形式如下:
-
从栈顶删除数据(出栈)
当用户弹出栈元素时,就是将存储的值返回给用户。即通过删除容器顶端的元素实现pop,其函数原型如下:
前置条件:stack指向之前创建的栈,pValue为指向存储返回值变量的指针;
后置条件:如果栈不空,将栈顶的值拷贝到*pValue,删除栈顶的值,该函数返回true,如果删除前栈为空,栈不变,该函数返回false。
其调用形式如下:
-
判断栈是否为空
判断栈是否为空的函数原型如下:
前置条件:stack指向之前创建的栈;
后置条件:如果栈为空则返回true,否则返回false。
其调用形式如下:
-
判断栈是否已满
判断栈是否已满的函数原型如下:
前置条件:stack指向之前创建的栈;
后置条件:如果栈已满则返回true,否则返回false。
其调用形式如下:
-
确定栈中元素的个数
确定栈中元素的个数的函数原型如下:
前置条件:stack指向之前创建的栈;
后置条件:返回栈中元素的个数。
其调用形式如下:
-
读取栈中任何位置的元素
读取栈栈任意位置元素的函数原型如下:
前置条件:stack指向之前创建的栈,index为索引值,表示返回栈中某个位置的元素, pValue为指向存储返回值变量的指针;
后置条件:如果index大于top,该函数返回false,反之将index位置的值拷贝到*pValue,该函数返回true。
其调用形式如下:
由于数组的下标是从0开始的,当index为0时,则getStackElemnt(stack, 0, &temp)返回栈顶的元素
- 单片机与程序设计(下)(08-13)
- 单片机与程序设计(上)(08-12)
- 周立功手把手教你学嵌入式编程:函数指针与指针函数的应用(07-29)
- 周立功教你学程序设计技术:做好软件模块的分层设计,回调函数要这样写(07-30)
- 周立功《程序设计与数据结构》:字符串函数(08-05)
- 周立功教你学程序设计结构体:内存对齐和基本数据类型(08-01)