/* 栈的数组实现声明 */
struct StackRecord;
typedef struct StackRecord *Stack; #define MinSstackSize 5
#define EmptyTOS -1
struct StackRecord
{
int Capacity;
int TopOfStack;
ElementType *Array;
}; /* 栈的创建-数组实现 */
Stack
CreateStack( int MaxElements )
{
Stack S;
if( MaxElements < MaxStackSize )
ERROR("stack is too small");
S = malloc(sizeof( struct StackRecord ));
if( S == NULL )
FatalError("out of Space");
S->Array = malloc(sizeof(ElementType) * MaxElements);
if( S->Array == NULL )
Fatalerror("out of space");
S->Capacity = MaxElements;
MakeEmpty( S );
return S;
}
/* 数组事项创建空栈的例程 */
void
MakeEmpty( Stack S )
{
S->TopOfStack =EmptyTOS;
}
/* 释放栈 */
void
DisposeStack( Stack S )
{
if(S != NULL ){
free( S->Array );
free( S );
}
}
/* 监测一个栈是否空栈的的例程 */
int
IsEmpty( Stack S )
{
return S->TopOfStack == -;
}
/* 判断栈满 */
int
IsFull( Stack S )
{
return TopOfStack == Capacity - ;
}
/* 进栈的例程 */
void
Push( ElementType X, Stack S)
{
if( IsFull( S ) )
ERROR("stack is full");
else
S->Array[ ++S->TopOfStack ] = X;
}
/* 返回栈顶的例程 */
ElementType
Top( Stack S )
{
if( IsEmpty( S ) ){
ERROR("stack is empty");
return ;//避免无
}
else
return S->Array[ S->TopOfStack ];
} /* Pop操作 */
/* TopOfStack相当于指向栈顶元素的指针 */
/* TopOfStack-- 只是让指针下移,但是没消除原来数据,下次要Push就直接覆盖*/
/* 并且S->Array 的栈空间设定好了,即MaxElements */ void
Pop( Stack S )
{
if( IsEmpty( S ) )
ERROR("Empty stack");
else
S->TopOfStack--;
}
ElementType
PopAndTop( Stack S )
{
if( !IsEmpty( S ) )
return S->Array[ S->TopOfStack-- ];
}

这个数据结构的核心是:Stack S,S为指向结构的指针,结构里面内含指针,用来指向malloc出的内存(数组)地址

一个结构体成员包括TopOfStack(指向栈顶元素的下标(指针))、ElementType *Array(该指针指向malloc出来的一块连续内存,相当于数组)、Capacity(表示这个栈的容量 == MaxElements)

malloc出来的空间是NULL            FataError()

pop 和 Top 空栈 或MaxElements < MinStackSize                      Error()

不过没找到这两个函数,好像是异常处理?

栈ADT的数组实现的更多相关文章

  1. LIFO栈 ADT接口 数组实现

    LIFO 栈结构 typedef int ElemenType; struct seqStack{ ElemeType data[MaxSize]; int top; }; typedef struc ...

  2. 《数据结构与算法分析》学习笔记(四)——栈ADT

    一.栈ADT是what? 1.定义 栈,是限制插入和删除都只能在一个位置上进行的表. 2.图示 3.栈的基本功能 (1)是否为空 (2)进栈 (3)出栈 (4)清空 (5)取栈顶 二.栈的链表实现 # ...

  3. ②泡茶看<数据结构>,喜欢看源码-栈ADT

    前言 听着天籁,我是个音乐迷.时间充实着,会过得很快.我马上也可以到傍晚的时候去乐室吹我心爱的萨克斯. 嘟嘟嘟... 我会吹一首简单的歌咯,哈哈我想到了一个神奇的比喻,待会说. 栈ADT模型(又称LI ...

  4. 3.6 栈 ADT - 3.7 队列 ADT

    3.6 栈 ADT 栈是限制插入和删除只能在一个位置上进行的表,叫做栈的顶部.对栈的基本操作有进栈和出栈,进栈在顶部插入元素,出栈删除最后插入的元素. 栈是一个表,因此任何实现表的方法都能实现栈.显然 ...

  5. 栈ADT的链表实现

    /* 栈ADT链表实现的类型声明 */ struct Node; typedef struct Ndoe *PtrToNode; typedef PtrToNode Stack; struct Nod ...

  6. 多项式ADT的数组实现

    /*删除表的正确方法*/ /*assume header*/ void DeleteList(List L) { Position p,Tmp; p=L->Next; while(p != NU ...

  7. C#编程(七十六)----------使用指针实现基于栈的高性能数组

    使用指针实现基于栈的高性能数组 以一个案例为主来分析实现方法: using System; using System.Collections.Generic; using System.Linq; u ...

  8. C语言提高 (3) 第三天 二级指针的三种模型 栈上指针数组、栈上二维数组、堆上开辟空间

    1 作业讲解 指针间接操作的三个必要条件 两个变量 其中一个是指针 建立关联:用一个指针指向另一个地址 * 简述sizeof和strlen的区别 strlen求字符串长度,字符数组到’\0’就结束 s ...

  9. 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结

    堆和栈的区别 一个由C/C++编译的程序占用的内存分为以下几个部分1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.2.堆区(heap ...

随机推荐

  1. javascript之window对象

    window :window对象是BOM中所有对象的核心,除了是BOM中所有对象的父对象外,还包含一些窗口控制函数. 1.全局的window对象 JavaScript中的任何一个全局函数或变量都是wi ...

  2. 序列化与反序列化 - BinaryFormatter二进制(.dat)、SoapFormatter(.soap)、XmlSerializer(.xml)

    序列化的作用是什么?为什么要序列化? 1.在进程下次启动时读取上次保存的对象的信息. 2.在不同的应用程序域或进程之间传递数据. 3.在分布式应用程序中的各应用程序之间传输对象. 所为序列化,就是将对 ...

  3. C语言随笔_区分=与==

    写C程序时,经常发现大家=与==分不清.最常见的写法如下:int a = 3;if(a = 1){.......} 写程序的人原意是想如果a等于1的话,就执行花括号里的语句,a初始化时的值是3,也就是 ...

  4. jsp用jstl标签比较枚举

    日向博客最近在优化,有这一样一个小问题,我希望在下面的消息中心页面,未读的消息链接显示蓝色,已读的消息显示红色: 这就需要用jstl做一个判断. 之前的代码是这种形式: 消息中心:<br> ...

  5. java基础之集合List-ArrayList、LinkedList、Vector的差别

    PS:本篇博客主要參考jdk的底层源代码.而非自己动手写代码. 请问ArrayList.LinkedList.Vector的差别 ①ArrayList底层实际上是採用数组实现的(而且该数组的类型的Ob ...

  6. poj1664 放苹果(递归)

    转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj.org/problem?id=1664 ------ ...

  7. ZendStudio快捷键 注释的快捷键

    注:本文省略“通用快捷键”描述,诸如:ctrl+N=新建,ctrl+O=打开,ctrl+C=复制,ctrl+V,ctrl+X……等等几乎所有软件都通用的一组快捷键,而着重介绍zde独有的快捷键,了解并 ...

  8. ES6的模块化

    在之前的 javascript 中一直是没有模块系统的,前辈们为了解决这些问题,提出了各种规范, 最主要的有CommonJS和AMD两种.前者用于服务器,后者用于浏览器.而 ES6 中提供了简单的模块 ...

  9. linux/module.h: No such file or directory 内核模块编译过程

    1.缺少Linux kernel头文件 To install just the headers in Ubuntu: sudo apt-get install linux-headers-$(unam ...

  10. Maven 工程下 Spring MVC 站点配置 (二) Mybatis数据操作

    详细的Spring MVC框架搭配在这个连接中: Maven 工程下 Spring MVC 站点配置 (一) Maven 工程下 Spring MVC 站点配置 (二) Mybatis数据操作 这篇主 ...