栈的定义:深入理解数据结构与算法

发表时间: 2021-03-25 08:29

持续分享嵌入式技术,操作系统,算法,c语言/python等,欢迎小友关注支持

前面的文章我们已经介绍了线性表和链表的相关概念,本章小编打算讲解一下栈的相关知识。栈在数据存储中是占有一席之地的,计算机在运行的过程中会频繁的操作栈空间,进行一系列的出栈入栈的操作。那么栈的结构究竟是怎样的呢,我们一起来看下吧。

栈的定义

首先我们先来了解一下栈是怎么定义的,它的数据结构是怎么样的,有什么特点呢。

栈是一种特殊的线性表,规定它的插入运算和删除运算均在线性表的同一端进行,进行插入和删除的那一端称为栈顶,另一端称为栈底。栈的插入操作和删除操作也分别简称进栈和出栈。

栈是限定在一端(表尾)进行插入或删除操作的线性表。表尾端称栈顶,表头端称栈底。如下图所示:

栈的特点是数据的删除和插入也叫进栈和出栈都是在栈顶进行操作的,也就是说最先进栈的数据最后才能出栈,这个叫做先进后出(FILO, First In Last Out)

栈 具 有 后 进 先 出 或 先 进 后 出(FILO, First In Last Out)的性质

栈的存储结构

其实栈的存储结构有两种,一种叫顺序栈,一种叫链式栈,本章小编主要介绍顺序栈的相关操作。

首先我们先看下顺序栈的定义

栈的顺序存储方式就是在顺序表的基础上对插入和删除操作限制它们在顺序表的同一端进行,所以同顺序表一样也可用一维数组表示。

一般地,可以设定一个足够大的一维数组存储栈,数组中下标为0的元素就是栈底,对于栈顶,可以设一个指针top指示它。下面就是顺序栈的存储结构。

栈的顺序存储结构的C语言描述如下:

#define MAXSIZE 100typedef int datatype;typedef struct{  datatype a[MAXSIZE];  int top;}sequence_stack;sequence_stack st;

栈的相关操作主要有初始化,出栈,入栈等。下面我们就来一一举例说明。

首先我们先来看下栈的初始化,以及判空的操作

void init(sequence_stack st) {	st->top=0;}

初始化顺序栈,top=0表示栈空,这种情况下栈顶指示位内容始终为空。

int empty(sequence_stack st) {	return(st.top? 0:1);}

判断栈(顺序存储)是否为空

顺序栈的入栈操作

int push(sequence_stack st,datatype x){  if(st->top==MAXSIZE) {    return 0;  }  st->a[st->top]=x;  st->top++;  return 1;}

顺序栈的出栈操作

int pop( ){  if(st->top==0){    return 0;  }  st->top--;  return 1;}

读取顺序栈栈顶

datatype read(sequence_stack st) {if (empty(st)){  printf("\n栈是空的!");  exit(1);}else	return st.a[st.top-1];}

以上就是顺序栈的相关操作,可以看出很简单,跟之前讲述的线性表的操作没有太大的区别,下一章我们继续讲述链式栈的数据结构及相关操作。

如果觉得这篇文章对你有帮助,请点赞关注下。如有错误欢迎指正