栈的实现
对空栈的POP和对满PUSH都是越界异常
两种实现方式:
表实现 数组实现
1。表实现:
栈ADT链表实现的类型声明
#ifndef _Stack_h
struct NOde;
typedef struct Node *PtrToNode;
typedef PtrToNode Stack;
int IsEmpty(Stack S);
Stack CreateStack(void );
void DisposeStack(Stack S);
void MakeEmpty(Stack S);
void Push(ElementType X,Stack S);
ElementType Top(Stack S);
void Pop(Stack S);
#endif
struct Node
{
ElementType Element;
PtrToNode Next;
};
测试栈是否是空栈
int IsEmpty(Stack S)
{
return S->Next==NULL;
}
创建一个空栈的例程
void MakeEmpty(Stack S)
{
if(S==NULL)
Error ("Must use CreateStack first");
else
while(!IsEmpty(S))
{
Pop(S);
}
}
Push进栈的例程
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;
}
返回栈顶元素
ElementType Top(Stack S)
{
if(!IsEmpty (S))
return S->Next->Element;
Error("Empty stack");
return 0;
}
从栈弹出元素
void Pop(Stack S)
{
PtrToNode FirstCell;
if(IsEmpty(S)
Error(Empty stack);
else
{
FirstCell=S-Next;
S->Next=S->Next->Next;
free(FirstCell);
}
}
2。数组实现
#ifndef _Stack_h
struct StackRecord;
typedef struct StackRecord *Stack;
int IsEmpty(Stack S);
int IsFull(Stack S);
Stack CreateStack(int MaxElements);
void DisposeStack(Stack S);
void MakeEmpty(Stack S);
void Push(ElementType X,Stack S);
ElementType Top(Stack S);
void Pop(Stack S);
ElementType TopAndPop(Stack S);
#endif
struct StackRecord
{
int Capacity;
int TopOfStack;
ElementType *Array;
};
栈的创建
Stack CreateStack(int MaxElements)
{
Stack S;
if(MaxElement<MinStackSize)
Error("Stack size is too Small");
S=malloc(sizeof(struct StackRecord));
if(S==NULL)
FatalError("Out of space");
S->Array=mallloc(sizeof(ElementType)*MaxelEment);
if(S->Array==NULL)
FatalError("out of space");
S->Capacity=MaxElements;
MakeEmpty(S);
return S;
}
释放栈
void DisposeStack(Stack S)
{
if(S!=NULL)
{
free(S-Array);
free(S);
}
}
检测一个栈是否为空
int IsEmpty(Stack S)
{
return S->TopOfStack==EmptyTOS;
}
创建一个空栈
void MakeEmpty(Stack S)
{
S->TopOfStack=EmptyTOS;
}
进栈
void Push(ElementType X,Stack S)
{
if(IsFull(S)){Error("Fulll Stack");}
else
S->Array[++S->TopOfStack]=X;
}
将栈顶返回
ElementType Top(Stack S)
{
if(!IsEmpty(S))
return S->Array[S->TopOfStack];
Error("Empty Stack");
return 0;
}
从栈顶弹出
void Pop(Stack S)
{
if(IsEmpty(S))
Error("Empty Stack ");
else
S->TopOfStack--;
}
给出栈顶元素并弹出
ElementType(Stack S)
{
if(!IsEmpty(S))
return S->Array[S->TopOfStack--];
}
else
Error("Empty Stack");
return 0
分享到:
相关推荐
1. **理解栈的概念及其在内存中的存储方式**:熟悉栈的基本特性和工作原理,了解栈如何通过两种主要的存储结构(链式存储与顺序存储)来实现。 2. **掌握栈的常用算法实现**:能够熟练运用 C++ 编程语言编写栈的基本...
栈是一种特殊的线性数据结构,遵循“后进先出”(LIFO)原则,常被用于解决许多复杂问题,如表达式求值就是其中之一。在这个主题中,我们将探讨如何利用栈来计算表达式的值,具体分为两种方法:直接法和逆波兰表示法...
在数据结构中,栈是一种非常重要的数据结构,通常被称为后进先出(Last In First Out,LIFO)的线性数据结构。本文将详细介绍栈的概念、实现方式以及在编程和算法设计中的应用,并提出一种教学设计方案,以此帮助...
在这个名为“数据结构栈的实现实验”的项目中,我们主要关注的是栈这一重要的数据结构。栈是一种特殊的线性表,其操作遵循“后进先出”(LIFO)原则,即最后进入栈的元素最先被移出。在这个实验中,我们将学习如何...
在计算机科学中,数据结构是组织和存储数据的方式,它对于高效的算法设计至关重要...通过分析`stack_SqStack`和`stack_SLinkList`这两个文件,你可以深入了解Java中栈的两种实现方式,并学习如何在实际项目中灵活运用。
以上介绍了栈和队列两种基本的数据结构以及它们的不同实现方式——链式存储和顺序存储。这些基础数据结构在编程语言中应用广泛,理解它们的原理和实现对于学习更高级的数据结构和算法至关重要。
在本项目“C语言数据结构用栈实现四则运算”中,开发者利用栈这种数据结构来处理数学中的四则运算,包括加法(+)、减法(-)、乘法(*)和除法(/)。这种方法相比传统的递归或循环方式,通常更加简洁且易于理解。...
本主题关注的是如何使用C语言来实现数据结构中的栈和队列,这是两种基础但非常重要的抽象数据类型(ADT)。 栈(Stack)是具有后进先出(LIFO)特性的数据结构。它类似于一个堆叠的盘子,最新的元素被放在顶部,...
顺序栈是其中最基础且重要的数据结构之一,常被用于处理需要“后进先出”(Last In First Out, LIFO)逻辑的问题。本文将深入探讨顺序栈的概念,并通过C语言来实现它。 顺序栈是一种线性数据结构,它的元素在内存中...
在压缩包内的源代码文件可能包含了以上所述的栈和队列的不同实现方式,通过阅读和理解这些代码,我们可以学习到如何在实际编程中有效地利用这两种数据结构。例如,可能会有C++、Java、Python或其他语言的实现,每种...
总的来说,数据结构中的栈是一个基础且强大的工具,静态数组实现则提供了一种简单而高效的实现方式。对于新手来说,掌握这些基本概念和实现方法,能够为后续的编程学习打下坚实的基础。在实际开发中,根据需求选择...
本文档主要涉及到数据结构的两个重要概念:栈和队列,并介绍了如何使用这两个数据结构来解决迷宫问题。 一、栈的基本概念 栈是一种后进先出(Last-In-First-Out,LIFO)的数据结构。栈的基本操作包括入栈(push)...
本项目重点探讨了两种基本数据结构——栈(Stack)和队列(Queue),并使用C语言进行了实现。C语言是一种底层编程语言,适合进行这种底层数据结构的构建,因为它提供了对内存管理的直接控制。 栈是一种后进先出...
栈和队列是两种基础且重要的数据结构,广泛应用于各种算法和程序设计中。本课件及课堂笔记将深入探讨这两种数据结构的概念、特性以及它们在实际问题中的应用。 栈(Stack)是一种后进先出(LIFO,Last In First Out...
1. 实验目的:明确学习栈和队列的目的,比如理解其工作原理,掌握如何实现和应用这些数据结构。 2. 知识回顾:解释栈和队列的基本概念,包括它们的定义、特性以及在实际问题中的应用。 3. 实验设计:描述所使用的...
本资源“动画演示学习学习数据结构(c,pascal两种语言实现)”提供了对数据结构的深入理解和实践,通过动画演示和源代码实现了两种经典的编程语言——C和Pascal的实现方式。 首先,我们要理解数据结构的基本概念。...
在C++中实现栈,通常有两种方式:一是使用标准模板库(STL)中的`stack`容器,二是自定义栈结构。在这个案例中,描述提到已经基本实现了栈的功能,这可能指的是使用了自定义栈结构。自定义栈通常包括两个主要部分:...
栈是一种后进先出(LIFO)的数据结构,常用于解决逆序操作的问题,比如表达式求值。 首先,让我们来看看"中缀转后缀表达式计算"。在计算表达式时,中缀表达式(如2 + 3 * 4)是最常见的形式,但它的计算需要考虑...
在这个主题中,我们将专注于两种基本的线性数据结构:栈和队列,特别是C语言实现的顺序栈。顺序栈是一种在内存中连续分配空间的抽象数据类型,它具有后进先出(LIFO)或先进后出(FILO)的特性。 ### 栈的基本概念 ...
在IT领域,数据结构是计算机科学的基础,它们是组织和管理数据的方式,直接影响到程序的效率和性能。在这个实验中,我们将关注四种特定的数据结构:共享栈、链栈、循环队列和链队列。这些数据结构在各种算法和应用...