[BS]栈 ADT

栈有两种实现方式:单链表、数组

本文是单链表实现方式的基本操作。

数据结构:

struct Node
{
	ElementType Element;
	PtrToNode	Next;
};

数据类型:

typedef int ElementType;
typedef struct Node *PtrToNode;
typedef PtrToNode Stack;

基本操作:

/* Return 1 if stack is NULL */
int
IsEmpty( Stack S )
{
	return S->Next == NULL;
}

NOTICE THIS FUNCTION

/* Create a void stack */
Stack
CreateStack( void )
{
	Stack S;/* S point to heap */

	S = malloc( sizeof( struct Node ) );
	if( S == NULL )
		FatalError( "Out of space!!!" );
	S->Next = NULL;
	MakeEmpty( S );
	return S;
}
/* Make a stack empty */
void
MakeEmpty( Stack S )
{
	/*if( S == NULL )
		Error( "Must use CreateStack first" );
	else
		while( !IsEmpty( S ) )
			Pop( S );*/
	if( S != NULL )
		while( !IsEmpty( S ) )
			Pop( S );
	else/* S == NULL */
		Error( "Must use CreateStack first" );
}
/* Push X into stack S */
void
Push( ElementType X, Stack S )
{
	PtrToNode TmpCell;

	TmpCell = malloc( sizeof( struct Node ) );
	if( TmpCell == NULL )
		FatalError( "Out of space!!!" );
	else
	{
		TmpCell->Element = X;
		TmpCell->Next = S->Next;
		S->Next = TmpCell;
	}
}
/* Abtain the top element of stack S */
ElementType
Top( Stack S )
{
	if( !IsEmpty( S ) )
		return S->Next->Element;
	Error( "Empty stack" );
	return 0;/* Return value used to avoid warning */
}
/* Pop the top element of stack S */
void
Pop( Stack S )
{
	PtrToNode FirstCell;

	if( IsEmpty( S ) )
		Error( "Empty stack" );
	else
	{
		FirstCell = S->Next;
		S->Next = S->Next->Next;
		free( FirstCell );
	}
}
/* Dispose stack */
void
DisposeStack( Stack S )
{
	MakeEmpty( S );
	free( S );
}
/* Print all the elements of stack */
void
PrintStack( Stack S )
{
    Stack sTmp;
    sTmp = S;
    while( sTmp->Next != NULL )
    {
        printf( "%d ",sTmp->Next->Element );
        sTmp = sTmp->Next;
    }
}

NOTICE THIS FUNCTION

/* Main function */
int
main()
{
    int iReturn;
    Stack Sa = CreateStack( );
    Push( 1, Sa );
    Push( 2, Sa );
    Push( 3, Sa );
    Push( 4, Sa );
    Push( 5, Sa );
    Pop( Sa );
    Pop( Sa );
    PrintStack( Sa );
    return 0;
}

细心的读者不难注意到(这句话),两个函数前面标明了NOTICE THIS FUNCTION,在第一个函数中:

/* Create a void stack */
Stack
CreateStack( void )
{
	Stack S;/* S point to heap */

	S = malloc( sizeof( struct Node ) );
	if( S == NULL )
		FatalError( "Out of space!!!" );
	S->Next = NULL;
	MakeEmpty( S );
	return S;
}

Stack S;/* S point to heap */

再看第二个函数也就是main函数:

/* Main function */
int
main()
{
    int iReturn;
    Stack Sa = CreateStack( );
    Push( 1, Sa );
    Push( 2, Sa );
    Push( 3, Sa );
    Push( 4, Sa );
    Push( 5, Sa );
    Pop( Sa );
    Pop( Sa );
    PrintStack( Sa );
    return 0;
}

Stack Sa = CreateStack( );

在这里调用了CreateStack(),这个函数是带有返回值的,并且返回的是一个指针,注意:函数不能返回指向栈内存的指针!

但是这里的指针是指向堆内存的?所以可以返回?以上测试时可以正常进行的!

时间: 2024-10-13 21:42:03

[BS]栈 ADT的相关文章

栈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;

回顾栈ADT的7点

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

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

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

栈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

两种实现栈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[]

LIFO栈 ADT接口 链表实现

LIFO 链栈结构 1 typedef int ElemType; 2 struct node{ 3 ElemType data; 4 struct node* next; 5 }; 6 typedef struct node* LinkedStack; LIFO 链栈基本操作 1 //LIFO 链栈初始化 2 void InitStack(LinkedStack top){ 3 top = NULL; 4 } 5 6 //LIFO 链栈判断栈空 7 boolean StackKEmpty(Li

第三章节 表,栈,队列

抽象数据类型(abstract data type ADT)是带有一组操作的对象的集合. 一. 表ADT 表的数组实现  数组实现时,插入和删除的花费可能会比较大,这样要看操作发生在什么地方.最坏情况如,在0处插入,和删除第一个元素.此时为O(N). 如果表是通过在高端插入,其后只发生对数组的查找访问(findKth),则数组很适合.否则,不是. 简单链表 为了避免插入和删除的线性开销,应该使表可以不连续存储.否则表的每个部分都可能要整体移动.这样就是链表. findKth(i)要花费O(i)的

&lt;数据结构与算法分析 C++描述&gt; 表/栈/队列

这一章主要内容: * 抽象数据类型(ADT)的概念 * 实现表/栈/队列 * 了解这三个数据结构的应用场景 1. ADT ADT: abstract data type, 是抽象的数学模型,在该模型上定义了一系列的操作.使用它的人,不需要了解它的存储方式,只关心它的逻辑特征.可以使用三元组的方法来表示(D,S,P),D是数据对象,S是数据之间的关系,P是对数据的基本操作,具体介绍,可以参考帖子:点击打开链接 2. 表ADT 表的数据自然是单个元素,而元素之间的关系是前驱与后继,操作包括查找/插入