1.内存分配
ADT如何获取内存来存储值?三种方案:静态数组、动态分配的数组和动态分配的链式结构。
静态数组要求结构的长度固定,而且长度必须在编译时确定,方案简单,最不容易出错
动态数组,可在运行中决定数组长度,
链式结构提供最大程度的灵活性,每个元素在需要时才单独进行分配,除了不能超过机器的可用内存之外,这种方式对元素的数量几乎没有什么限制,但链式结构的链接字段需要消耗一定的内存。
2.堆栈
堆栈(stack)最鲜明的特点是其后进先出的方式
2.1 堆栈接口
基本的堆栈操作通常被称为push和pop。push是把一个新值压入到堆栈顶部,pop是把堆栈顶部的值移出堆栈并返回这个值。
2.2 实现堆栈
堆栈是最容易实现的ADT,基本方法:当值被push到堆栈时把它们存储于数组中连续的位置上,记住最近一个被push的值的下标。如果需要执行pop操作,只需要简单的减少这个下标的值即可。
/一个堆栈模块的接口/
#define STACK_TYPE int /堆栈存储的值的类型/
/push:把一个新值压入到堆栈中,它的参数是需要被压入/
void push(STACK_TYPE value);
/pop:从堆栈弹出一个值,并将其丢弃/
void pop(void);
/top:返回堆栈顶部元素的值,但不对堆栈进行操作/
STACK_TYPE top(void);
/is_empty 如果堆栈为空,返回ture,否则返回FASLE/
int is_empty(void);
/is_full 如果堆栈为满,返回ture,否则返回FASLE/
int is_full(void);
2.2.1 动态数组堆栈
在静态数组堆栈实现的基础上,增加两个新的函数,创建和销毁堆栈,主要是内存的申请与销毁
2.2.2 链式堆栈
由于只有堆栈的顶部元素才可以访问,所以使用单链表就可以很好的实现链式堆栈,把一个新元素压入到堆栈是通过在链表的起始位置添加一个元素实现。从堆栈中弹出一个元素是通过从链表中移除第1个元素实现的。位于链表头部的元素总是很容易被访问。
/*
**一个用链表实现的堆栈,没有长度限制
*/
#include “stack.h”
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <assert.h>
#define FALSE 0
/*
** 定义一个结构以存储堆栈元素,其中link字段指向堆