栈ADT的数组实现

/* 栈的数组实现声明 */
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 == -1;
}
/* 判断栈满 */
int
IsFull( Stack S )
{
    return TopOfStack == Capacity - 1;
}
/* 进栈的例程 */
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 0;//避免无
    }
    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()

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

时间: 2024-10-23 18:31:57

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

回顾栈ADT的7点

1.简单的说,栈就是只在一个位置上进行插入和删除操作的表,而这个特殊的位置就是表的末端,但这却不被成为栈的末端,而是顶(Top). 2.栈的基本操作时进栈和出栈,英文名分别是push和pop,分别相当于插入和删除.切记对空栈进行pop和top操作在栈ADT被认为是错误的,而如果push在空间之外进行操作也是有实现限制的,但这并不是ADT错误. 3.栈的特点是后进先出,对于学生来说可能用食堂里堆砌起来的餐盘做形容更加合适. 4.栈既可以用单向链表来实现,也可以用数组来实现.用单向链表自然是比较简单

栈ADT的实现

/* 栈ADT链表实现的类型声明 */ struct Node; typedef struct Ndoe *PtrToNode; typedef PtrToNode Stack; struct Node{ ElementType Element; Stack Next; }; /* 测试是否为空栈 */ int IsEmpty( Stack S ) { return S->Next == NULL; } /* 创建空栈 */ Stack CreateStack(void) { Stack S;

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

使用指针实现基于栈的高性能数组 以一个案例为主来分析实现方法: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 基于堆栈的数组 { class Program { static void Main(string[] args) { int[] i = new int[10]; Console.W

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

堆和栈的区别 一个由C/C++编译的程序占用的内存分为以下几个部分1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.2.堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵.3.全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻

Uva - 1513 Moive collection ( 模拟栈 + 树状数组基本操作 )

Uva - 1513 Moive collection ( 模拟栈 + 树状数组基本操作 ) 题意: 一个书架,原来所有的书都是按顺序摆好的,书的编号从1开始到n 操作: 取出一本书,统计在这本书之前有多少本书,统计完之后,将这本书放在书架的第一位. 如:  1 2 3 4 5取4   4 1 2 3 5 (取之前,有3本书在4前面,取完后,将4放在栈顶)取4   4 1 2 3 5 (取之前,有0本书在4前面,取完后,将4放在栈顶)取2   2 4 1 3 5 (取之前,有2本书在2前面,取完

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

一.栈ADT是what? 1.定义 栈,是限制插入和删除都只能在一个位置上进行的表. 2.图示 3.栈的基本功能 (1)是否为空 (2)进栈 (3)出栈 (4)清空 (5)取栈顶 二.栈的链表实现 <数据结构与算法分析>学习笔记(四)--栈ADT

栈的C数组实现

栈是一种先进后出的数据结构. 栈的基本操作包括:入栈,出栈,初始化栈,清空栈,遍历栈. C代码如下: #include <stdio.h> #define MaxSize 20 typedef int ElemType; typedef struct stack { ElemType Data[MaxSize]; int top; }Stack; //初始化栈 void InitStack(Stack *S) { S->top=-1; } //入栈 void PushStackValue

两种实现栈ADT的方式

栈是一种先进后出或说是后进先出的数据结构,书中介绍了两种简单实现方法,其中使用链表的是比较方便的方式,而是用数组的方式效率比较高,但是需要初始化的时候指明最大数组元素上限个数. 下面是简单实现: 1. 链表方式 ListStack.cpp 1 /*栈的数组实现*/ 2 #include "iostream" 3 #include "stdlib.h" 4 5 #define log(s); std::cout<<s<<std::endl; 6

栈 ADT

栈(stack)是插入和删除只能在一个位置上进行的表(后进先出),该位置是表的末端,叫做栈的顶(top).对栈的基本操作有 push(进栈) 和 pop(出栈),push 相当于插入,pop 相当于删除. 左图栈模型说明:通过 push 向栈输入,通过 pop 和 top 从栈输出 右图栈模型说明:栈顶是栈中唯一可见的元素 栈的数组实现 public class ArrayStack<T> { //设置为2是为了检验ensureCapacity()方法的正确性 private Object[]