当前课程知识点:数据结构(上) > 第四章 栈与队列 > (a)栈接口与实现 > 04A-1 栈
同学们好
接下来一章中的主角
是栈和队列 这对孪生兄弟
我们很快就会看到
它们都是我们此前所已经熟知的
线性序列的特例
然而 非常有意思的是
它们在算法以及应用中
都扮演着非常基本而重要的角色
在第一节中 我们将首先
来讨论栈这种结构
如何以ADT的形式来定义
和规范它的接口
以及如何借助此前
已研究有素的序列结构
简洁高效地加以实现
所谓的栈结构Stack
依然是由一组元素组成的线性序列
与一般的序列不同
在任何时候 我们只能够访问
栈中的一个特定元素
具体来说 就是其中某一端
最末端那个元素
而其余的元素呢
在当前 都是禁止访问的
因此 通常我们习惯于
将栈旋转90度
沿垂直方向画出
相应地 可以访问的开放的这一端
也就称作顶端top
而不开放的那个盲端称作底部
在我们日常生活中
可以见到很多栈的例子
比如说 在餐厅
堆接在一起的椅子或盘子
就是这样的一个模型
我们任何时候取出一把椅子
或者一个盘子
都是在它的顶端操作
反过来 如果要将一个椅子
或者是盘子归入其中
通常也只能将它摞在顶上
相信大家 对于汉诺塔问题都不会陌生
这个问题中的每一根柱子
其实也就对应的是一个栈
我们在任何时候 只能对它的顶端
最上方的那个盘子进行操作
当然这里附加的一个要求就是
所有的盘子必须按照
直径的大小单调排列
一般意义下的栈以及它的操作
可以由这样一组图来表示
我们可以看到 作为一个栈
在任何时刻 其中的元素
的确应该构成一个线性的序列
如果我们需要将
某一个新的元素插入其中
根据这里的约定
我们只能将它作为最顶部的元素插入
那么从效果上看
相当于是将一个碟子
摞在原有的一系列的碟子之上
那么这个动作我们也形象地
称之为push
反过来 如果我们需要从栈中
取出某一个元素
那么按照这里的规定
也只能取出当前这个顶部的元素
这个元素被取出之后
其余元素将依次向前递补
我们可以看到 将会出现一个
新的顶部元素
这样的一个过程
也形象地称为pop
当然 通常的栈还会提供
另一个辅助的接口
也就是 我们在有的时候
只希望查询顶部元素的数值
而并不需要将它真正的弹出
那么这样一个动作
我们也形象地称之为top
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)计算
--演示
--(a)计算--作业
-(b)计算模型
-(b)计算模型--作业
-(c)大O记号
-(c)大O记号--作业
-(d)算法分析
-(d)算法分析--作业
-(e)迭代与递归
-(e)迭代与递归--作业
-(xc)动态规划
-- 演示
-(xc)动态规划--作业
-本章测验--作业
-(a)接口与实现
--02A-5 复制
-(a)接口与实现--作业
-(b)可扩充向量
-(b)可扩充向量--作业
-(c)无序向量
--02C-1 概述
--02C-3 插入
--02C-6 查找
--02C-8 遍历
-(c)无序向量--作业
-(d1)有序向量:唯一化
-(d1)有序向量:唯一化--作业
-(d2)有序向量:二分查找
-(d2)有序向量:二分查找--作业
-(d3)有序向量:Fibonacci查找
-(d3)有序向量:Fibonacci查找--作业
-(d4)有序向量:二分查找(改进)
-(d4)有序向量:二分查找(改进)--作业
-(d5)有序向量:插值查找
-第二章 向量(下)--(d5)有序向量:插值查找
-(e)起泡排序
--02E-2 改进
--02E-3 反例
-(e)起泡排序--作业
-(f)归并排序
-(f)归并排序--作业
-本章测验--作业
-(a)接口与实现
--03A-4 实现
-(a)接口与实现--作业
-(b)无序列表
--03B-2 查找
-(b)无序列表--作业
-(c)有序列表
--03C-3 查找
-(c)有序列表--作业
-(d)选择排序
--03D-1 构思
--03D-2 实例
--03D-3 实现
--03D-4 推敲
--03D-6 性能
-(d)选择排序--作业
-(e)插入排序
--03E-1 经验
--03E-2 构思
--03E-3 对比
--03E-4 实例
--03E-5 实现
-(e)插入排序--作业
-(xd)习题辅导:LightHouse
-本章测验--作业
- (a)栈接口与实现
--04A-1 栈
--04A-2 实例
--04A-3 实现
- (a)栈接口与实现--作业
-(c1)栈应用:进制转换
-第四章 栈与队列--(c1)栈应用:进制转换
-(c2)栈应用:括号匹配
-(c2)栈应用:括号匹配--作业
-(c3)栈应用:栈混洗
-第四章 栈与队列--(c3)栈应用:栈混洗
-(c4)栈应用:中缀表达式求值
-(c4)栈应用:中缀表达式求值--作业
-(c5)栈应用:逆波兰表达式
-第四章 栈与队列--(c5)栈应用:逆波兰表达式
-(d)队列接口与实现
--04D-1 接口
--04D-2 实例
--04D-3 实现
-第四章 栈与队列--本章测验
-(a)树
--05A-1 动机
--05A-2 应用
-(a)树--作业
-(b)树的表示
--05B-2 父亲
--05B-3 孩子
-第五章 二叉树--(b)树的表示
-(c)二叉树
-(c)二叉树--作业
-(d)二叉树实现
-(d)二叉树实现--作业
-(e1)先序遍历
-(e1)先序遍历--作业
-(e2)中序遍历
-第五章 二叉树--(e2)中序遍历
-(e4)层次遍历
-第五章 二叉树--(e4)层次遍历
-(e5)重构
-(e5)重构--作业
-本章测验--作业
-(a)概述
-(a)概述--作业
-(b1)邻接矩阵
-(b1)邻接矩阵--作业
-(c)广度优先搜索
--06C-2 策略
--06C-3 实现
--06C-5 实例
-(c)广度优先搜索--作业
-(d)深度优先搜索
--06D-1 算法
--06D-2 框架
--06D-3 细节
-(d)深度优先搜索--作业
-第六章 图--本章测验