3.1栈的入门——概念与应用

来源:互联网 发布:db2数据库创建用户 编辑:程序博客网 时间:2024/05/01 10:06

初步认识栈

内容概述:先列举栈的来源框架结构,再开始介绍栈的一些基本知识点,继而说明顺序存储结构和链式存储结构,最后提到应用。

栈来源

  • 前文之前提到的线性表进行一定的操作受限就形成了栈和队列,其逻辑结构是属于线性结构,存储结构可通过顺序存储和链式存储实现。栈的出现是为了解决某些特定情形下的结构运算。具体可看下面的应用部分。

基本概念

栈是指只允许在一端进行插入或删除操作的线性表。因而它的操作受限是指只能在某一端进行插入和删除操作,因而栈的一个明显特性可以概括为后进先出(LIFO)。栈又可称为后进先出线性表。
下面是栈的一些专业名词解释:

名称 解释 栈顶 线性表允许进行插入和删除的那一端 栈底 固定的,不允许进行插入和删除的另一端 空栈 不含任何元素的空表

基本操作

函数名称 作用 InitStack(&S) 初始化一个空栈S StackEmpty(S) 判断一个栈是否为空,若栈为空则返回true,否则返回false Push(&S,x) 进栈,若栈S非空,将x加入使其称为新栈顶 Pop(&S,&x) 出栈,若栈S非空,弹出栈顶元素,并用x返回 GetTop(S,&x) 读栈顶元素,若栈S非空,用x返回栈顶元素 ClearStack(&S) 销毁栈,并释放栈S占用的存储空间
  • 这里的&S是指C++中引用的含义,在C语言中使用*可达到同样目的。一般传入参数,如果无需修改传入参数的值,则无需传址。

顺序存储结构

使用顺序存储结构实现的栈称为顺序栈,是指 利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针(top)指示当前栈顶的位置。

#define MaxSize 50     //定义栈中元素的最大个数typedef struct{    ElemType data[MaxSize];     //存放栈中元素    int top;                   //栈顶指针}SqStack;

这里是栈顺序存储实现代码

共享栈
共享栈是利用栈底位置相对不变的特性,可以让两个顺序栈共享一个一维数据空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸。

共享栈

链式存储结构

采用链式存储结构实现的栈称为链栈,优点在于多个栈共享存储空间和提高其效率,且不存在栈满上溢的情况。

typedef struct LinkNode{    ElemType data;     //数据域    strcu LinkNode * next;  //指针域}*LinStack;     //栈类型定义
  • 一般使用单链表实现,并且规定所有操作都是在单链表的表头进行,这里规定链栈无头结点,Lhead指向栈顶元素。如下图所示:
    链栈

应用

  1. 栈在括号匹配中的应用
    算法思想:
    (1)初始化设置一个空栈,顺序读入括号
    (2)若是右括号,则或者使置于栈顶的最急迫期待得以消解,或者是不合法的情况(括号序列不匹配,则退出程序)
    (3)若是左括号,则作为一个新的更急迫的期待压入栈中,自然使原有的在栈中的所有未消解的期待的急迫性降了一级。算法结束时,栈为空,否则括号系列不匹配

  2. 栈在表达式求值中的应用

  3. 栈在递归中的应用

原创粉丝点击