1.栈的概念
展示只允许在其一端进行插入语删除操作的表。从定义上来说,栈其实也是线性表,因此栈也具备大多数线性表所具备的基本操作。但是,从定义上可知,栈在进行插入、删除操作时,只能在一端进行操作,这一端成为栈顶(top)。
栈最核心的操作主要是:进栈(Push)、出栈(Pop)、返回栈顶元素(Top)。 此外,栈还判断栈是否为空、创见栈、清空栈等操作。
既然是线性表,那么栈从实现方式来说主要有两种:顺序存储实现(数组)、链式存储实现(链表)。下面是链式存储实现方式下,站的数据结构定义:
typedef struct Node *PtrToNode;
typedef PtrToNode Stack;
typedef struct Node
{
int Element;
PtrToNode Next;
};
栈的基本操作:
//判断栈是否为空
int IsEmpty(Stack S);
//创见栈
Stack CreateStack();
//销毁栈
void DisposeStack(Stack S);
//清空栈
void MakeEmpty(Stack S);
//进栈
void Push(int X,Stack S);
//返回栈顶元素
int Top(Stack S);
//出栈
void Pop(Stack S);
下面是一个完整的关于栈的基本操作的例子:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node *PtrToNode;
typedef PtrToNode Stack;
typedef struct Node
{
int Element;
PtrToNode Next;
};
int IsEmpty(Stack S);
Stack CreateStack();
void DisposeStack(Stack S);
void MakeEmpty(Stack S);
void Push(int X,Stack S);
int Top(Stack S);
void Pop(Stack S);
//判断栈是否为空
int IsEmpty(Stack S)
{
return S->Next == NULL;
}
//创建链栈
Stack CreateStack()
{
Stack S = malloc(sizeof(struct Node));
if(S == NULL)
{
printf("No enough memory!");
return NULL;
}
S->Next = NULL;
MakeEmpty(S);
return S;
}
void MakeEmpty(Stack S)
{
if(S == NULL)
{
printf("Use CreateStack First!");
}
else
{
while(!IsEmpty(S))
{
Pop(S);
}
}
}
void Push(int X,Stack S)
{
PtrToNode Tmp;
Tmp = malloc(sizeof(struct Node));
if(Tmp != NULL)
{
Tmp->Element = X;
Tmp->Next = S->Next;
S->Next = Tmp;
}
else
{
printf("Out of space!");
}
}
void Pop(Stack S)
{
if(IsEmpty(S))
{
printf("The Stack is Empty!");
}
else
{
PtrToNode Tmp = S->Next;
S->Next = Tmp->Next;
free(Tmp);
}
}
int Top(Stack S)
{
if(IsEmpty(S))
{
printf("The stack is empty!");
return 0;
}
else
{
return S->Next->Element;
}
}
int main(void)
{
Stack S = CreateStack();
int i;
for(i = 0; i < 5; i++)
{
Push(i,S);
}
while(!IsEmpty(S))
{
printf("%d\n",Top(S));
Pop(S);
}
return 0;
}
分享到:
相关推荐
在这个主题中,我们将专注于两种重要的数据结构实现:栈的顺序存储和链式存储。栈是一种特殊的数据结构,被称为“后进先出”(LIFO)结构,这意味着最后进入的元素将首先被取出。这种特性使得栈在许多算法和程序设计...
顺序存储栈通常使用数组来实现,而链式存储栈则使用链表数据结构。在实现栈时,需要设计数据类型来表示栈元素及其操作,这在高级编程语言中通常通过封装来完成。 在计算机科学和软件工程领域,栈的算法设计思想被...
用C++实现的栈操作,涉及顺序存储和链式存储。顺序存储的栈操作用类SeqStack实现,链式表存储的栈操作用LinkStack实现。main函数中做了部分测试。可根据需要继续扩充此程序。SeqStack和LinkStack可直接复制到其他...
在本实验中,我们主要探讨的是数据结构中的一个重要概念——栈(Stack),并采用C语言进行实现。栈是一种特殊的线性表,具有“后进先出”(LIFO,Last In First Out)的特性,其操作主要集中在一端,称为栈顶。在...
数据结构是计算机科学中的核心概念,它涉及到如何高效地存储和操作数据。栈是一种非常基础且重要的数据结构,被广泛应用于各种算法和程序设计中。本文将深入探讨栈的C语言实现,帮助读者理解栈的工作原理及其在实际...
本项目重点探讨了两种基本数据结构——栈(Stack)和队列(Queue),并使用C语言进行了实现。C语言是一种底层编程语言,适合进行这种底层数据结构的构建,因为它提供了对内存管理的直接控制。 栈是一种后进先出...
《一本通数据结构——栈的习题》可能涵盖了栈的各种基础和进阶问题,旨在帮助学习者深入理解栈的原理和应用。通过这些习题,你可以掌握以下知识点: 1. **栈的基本操作**:了解栈的两个基本操作,即入栈(Push)和...
数据结构——栈和队列经典测试题 一、栈和队列的概念和特点 栈是一种特殊的线性表,允许插入和删除运算的一端称为栈顶,不允许插入和删除运算的一端称为栈底。栈的特点是后进先出(Last In First Out,LIFO),即...
数据结构实验一线性表的基本操作 一、线性表的概念和类型 ...数据结构实验一线性表的基本操作的实验结果证明了线性表的基本操作的实现,并且实现了多项式相加的功能。实验结果表明了线性表的重要性和实用性。
栈可以由顺序存储结构和链式存储结构实现。顺序栈使用一维数组来实现,其中top指针指示栈顶的位置。如果栈顶指针top的值为0,表示栈为空;如果top的值等于数组的最大容量,则表示栈满。链栈使用链表来实现,栈顶指针...
实验二 单链表实验 一、实验目的 1、掌握用Visual C++6.0上机调试单链表的基本方法 2、掌握单链表的插入、删除、查找、求表长以及有序单链表的合并算法的实现 ...[基本要求]用链式存储结构实现存储
在这个项目中,我们探讨了如何使用C++来实现队列,并提供了两种常见的存储方式:顺序存储和链式存储。 一、队列的基本操作 1. 入队(Enqueue):将元素添加到队列的尾部。在顺序队列中,这通常意味着移动所有元素...
数据结构实验报告——线性表的插入、删除 在计算机科学领域中,数据结构是一种组织和存储数据的方式,以便更高效地...本实验通过实现链式存储线性表的插入和删除操作,展示了数据结构的基本概念和算法设计的重要性。
在这个"数据结构入门——队列的实现.rar"的压缩包中,我们主要关注的是队列这一基础但重要的数据结构。队列,正如其名,模拟了现实生活中的排队现象,遵循“先进先出”(FIFO, First In First Out)原则。这意味着最...
在数据结构中,栈和队列是两种常见的线性数据结构,它们在计算机科学和程序设计领域中扮演着重要角色。栈是一种后进先出(LIFO, Last In First Out)的数据结构,只能在栈顶进行插入(push)和删除(pop)操作。队列...
数据结构答案——最新李云清2009版! 该资源提供了数据结构的答案,涵盖了顺序表、链式存储、循环队列、排序等多个方面的知识点。下面是该资源的详细知识点解析: 1、顺序表(Sequence List) * 顺序表的概念:是...
本章将深入探讨两种重要的数据结构——栈和队列,以及它们的两种常见存储方式:顺序存储结构和链式存储结构。 栈(Stack)被称为“后进先出”(Last In, First Out,简称LIFO)的数据结构。栈的操作主要围绕两个...
在这个主题中,我们将深入探讨一种特殊的数据结构——栈(Stack),以及它与线性表的关系。栈是一种后进先出(Last In, First Out,简称LIFO)的数据结构,这意味着最后插入的元素最先被移除。栈在许多算法和程序...
《数据结构算法——Visual C++ 6.0程序集》电子教案是一个专为学习者准备的资源,它结合了理论与实践,通过Visual C++ 6.0这一经典编程环境来讲解数据结构和算法的实现。 在数据结构部分,课程可能涵盖了以下几个...