上文提到过栈以及栈的基本操作。上文中是基于链表做的实现。但是这种方法会出现大量的malloc()和free()操作,这种开销是非常昂贵的。
另外一种实现方式是基于数组的实现。这种实现方式需要预先制定一个栈的大小,此外还需要一个Top来记录栈顶元素下一个位置的数组索引值。如下图所示:
有的教材将Top指向栈顶元素,也就是上图中X所在的数组单元。我们这里不这么认为。
这种情况下栈的数据结构定义如下:
typedef struct StackRecord *Stack;
struct StackRecord
{
int Capacity;
int Top;
int *Array;
};
主要操作如下:
//判断栈是否为空
int IsEmpty(Stack S);
//判断栈是否已满
int IsFull(Stack S);
//创建栈
Stack CreateStack(int MaxElements);
//回收栈
void DisposeStack(Stack S);
//清空栈
void MakeEmpty(Stack S);
//进栈操作
void Push(int X, Stack S);
//返回栈顶元素
int Top(Stack S);
//出栈操作
void Pop(Stack S);
//出栈并且返回栈定元素
int PopAndTop(Stack S);
一个完整的例子代码如下:
#include <stdio.h>
#include <stdlib.h>
#define MIN_STACK_SIZE 5
typedef struct StackRecord *Stack;
struct StackRecord
{
int Capacity;
int Top;
int *Array;
};
//判断栈是否为空
int IsEmpty(Stack S);
//判断栈是否已满
int IsFull(Stack S);
//创建栈
Stack CreateStack(int MaxElements);
//回收栈
void DisposeStack(Stack S);
//清空栈
void MakeEmpty(Stack S);
//进栈操作
void Push(int X, Stack S);
//返回栈顶元素
int Top(Stack S);
//出栈操作
void Pop(Stack S);
//出栈并且返回栈定元素
int PopAndTop(Stack S);
int IsEmpty(Stack S)
{
return S->Top == 0;
}
int IsFull(Stack S)
{
return S->Top == S->Capacity;
}
void MakeEmpty(Stack S)
{
S->Top = 0;
}
Stack CreateStack(int MaxElements)
{
if(MaxElements < MIN_STACK_SIZE)
{
fprintf(stderr, "Can't create a Stack less than %d elements\n",MIN_STACK_SIZE);
exit(1);
}
else
{
Stack S = malloc(sizeof(struct StackRecord));
if(S == NULL)
{
fprintf(stderr, "Out of space!");
exit(1);
}
S->Array = malloc(sizeof(int)*MaxElements);
S->Capacity = MaxElements;
MakeEmpty(S);
return S;
}
}
void DisposeStack(Stack S)
{
if(S != NULL)
{
free(S->Array);
free(S);
}
}
void Push(int X, Stack S)
{
if(IsFull(S))
{
fprintf(stderr,"The Stack Is Full");
}
else
{
//元素先入栈
S->Array[S->Top++] = X;
}
}
int Top(Stack S)
{
if(!IsEmpty(S))
{
int tmp = S->Top - 1;
return S->Array[tmp];
}
else
{
fprintf(stderr,"The Stack Is Full");
exit(1);
}
}
void Pop(Stack S)
{
if(!IsEmpty(S))
{
--(S->Top);
}
else
{
fprintf(stderr,"The Stack Is Full");
exit(1);
}
}
int PopAndTop(Stack S)
{
if(!IsEmpty(S))
{
return S->Array[--S->Top];
}
else
{
fprintf(stderr,"The Stack Is Full");
exit(1);
}
}
int main(void)
{
Stack S = CreateStack(10);
int i;
for(i = 0; i < 10; i++)
{
Push(i,S);
}
while(!IsEmpty(S))
{
printf("%d ",PopAndTop(S));
}
printf("\n");
return 0;
}
分享到:
相关推荐
### 数据结构之——栈 #### 一、栈的基本概念 栈是一种特殊的线性表,它只允许在一端进行插入和删除操作。这一端被称为栈顶(top),另一端则称为栈底(bottom)。栈遵循“先进后出”(Last In First Out, LIFO)...
数据结构是计算机科学中的核心概念,它涉及到如何高效地存储和操作数据。栈是一种特殊的数据结构,被称作“后进先出”(LIFO,Last In First Out)的数据结构,因为最后添加的元素(压入栈顶)总是最先被移除(弹出...
顺序存储栈通常使用数组来实现,而链式存储栈则使用链表数据结构。在实现栈时,需要设计数据类型来表示栈元素及其操作,这在高级编程语言中通常通过封装来完成。 在计算机科学和软件工程领域,栈的算法设计思想被...
数据结构是计算机科学中的核心概念,它涉及到如何高效地存储和操作数据。栈是一种非常基础且重要的数据结构,被广泛应用于各种算法和程序设计中。本文将深入探讨栈的C语言实现,帮助读者理解栈的工作原理及其在实际...
数据结构是计算机科学中的核心概念,它涉及到如何高效地存储和操作数据。栈是一种非常重要的数据结构,被称为“后进先出”(Last In First Out, LIFO)的数据结构。在本篇中,我们将深入探讨栈的概念、基本操作以及...
数据结构是计算机科学中的核心概念,它涉及到如何高效地存储和操作数据。顺序栈是其中最基础且重要的数据结构之一,常被用于处理需要“后进先出”(Last In First Out, LIFO)逻辑的问题。本文将深入探讨顺序栈的...
《一本通数据结构——栈的习题》可能涵盖了栈的各种基础和进阶问题,旨在帮助学习者深入理解栈的原理和应用。通过这些习题,你可以掌握以下知识点: 1. **栈的基本操作**:了解栈的两个基本操作,即入栈(Push)和...
《数据结构——C++实现》(第二版)是一本经典的计算机科学教材,专注于介绍各种数据结构及其在C++编程语言中的实现。这本书的核心是通过实际的代码示例帮助读者理解和掌握数据结构的基本概念,这对于任何想要深入...
在给出的文件信息中,我们注意到标题是“算法和数据结构——栈.pdf”,这意味着文档的主要内容围绕栈这一数据结构以及相关算法的知识展开。描述中提到的是“#资源达人分享计划#”,这表明文档可能是一份资源分享或...
在实际编程中,C语言没有内置的栈和队列数据结构,但我们可以利用数组或链表自行实现。对于栈,我们可以在数组的末尾进行压栈和弹栈操作,或者在链表的尾部添加节点并在头部删除节点。对于队列,如果使用数组,我们...
- **自定义栈类**:如果需要更灵活的控制,或者对性能有特殊需求,可以自定义一个栈类,通常包含一个动态数组作为底层数据结构。例如: ```cpp template class MyStack { private: T* arr; int top; int ...
《C++数据结构——栈》 栈是一种在计算机科学中广泛应用的数据结构,它遵循“先进后出”(First In Last Out, FILO)的原则。在栈中,元素的插入(压栈)和删除(弹栈)操作只允许在栈顶进行。栈的主要特点在于其...
本项目重点探讨了两种基本数据结构——栈(Stack)和队列(Queue),并使用C语言进行了实现。C语言是一种底层编程语言,适合进行这种底层数据结构的构建,因为它提供了对内存管理的直接控制。 栈是一种后进先出...
数据结构——栈和队列经典测试题 一、栈和队列的概念和特点 栈是一种特殊的线性表,允许插入和删除运算的一端称为栈顶,不允许插入和删除运算的一端称为栈底。栈的特点是后进先出(Last In First Out,LIFO),即...
在这个话题中,我们将重点关注两种常见的数据结构——链表和数组,并探讨它们如何被用来实现栈这一特定的抽象数据类型。 栈是一种线性数据结构,遵循后进先出(LIFO)的原则,意味着最后进入的元素最先被移出。栈的...
在计算机科学领域中,数据结构是组织和存储数据的一种方式,以便可以更有效地访问和操作。在众多数据结构中,栈(Stack)是一种重要的线性数据结构,它遵循后进先出(LIFO,Last In First Out)的原则。本文将详细...
数据结构 C 语言实现系列 —— 栈 本文主要讲解了栈的基本操作,包括栈的初始化、元素入栈、元素出栈、读取栈顶元素、判断栈是否为空、清除栈中的所有元素等六种基本操作。同时,文章还详细介绍了栈的顺序存储结构...
东软数据结构实验报告——通过栈和队列来实现进制转换 实验报告〔一〕:东软数据结构实验报告——通过栈和队列来实现进制转换 实验名称:栈和队列的操作 指导教师:xxx 实验地点:xxx 实验日期:xxx 实验目的:...
本书《数据结构实验与习题——线性表栈和队列串数组树与二叉树》旨在帮助学生更好地理解和实践这些概念。 首先,书中介绍了C语言基础知识,这是实现数据结构的基础。C语言的基本输入输出、函数及其参数传递、以及...
栈是一种后进先出(Last In First Out,LIFO)的数据结构,其操作限定在表尾进行插入和删除。由于栈的这一特性,它在解决迷宫问题时非常有用。迷宫问题是一个古老而有趣的问题,通过将栈应用于迷宫的路径搜索中,...