#这篇文章只作为个人的读书笔记,内容均来自书本,请勿转载
定义:
栈:是限定仅在表尾进行插入和删除操作的线性表
栈顶:允许插入和删除的一端
栈底:不允许插入和删除的一端
进栈:插入操作
出栈,弹栈:删除操作
进栈出栈的变化形式:
3个元素有5种出栈次序:1、123进321出2、1进1出,2进2出,3进3出 3、。。。
栈的抽象数据类型(本质是线性表):
线性存储结构和链式存储结构对栈都是适用的
栈的顺序存储结构和实现:
进栈操作:
1、栈顶指针加一
2、插入数据
出栈操作:
1、取出栈顶元素
2、栈顶指针减一
两栈共享空间:
栈的链式储存结构及实现(链栈):
进栈操作:
出栈操作:
空间复杂度分析:
顺序栈和链栈的时间复杂度都是O(1),空间复杂度,顺序栈需要实现确定一个固定的长度,可能会浪费空间,优势是存取定位方便,而链栈要求每个元素都有指针域,增加了内存开销,对于栈的长度无限制。
栈的作用:
栈的引入简化了程序设计的问题,划分了不同的关注层次,是思考范围缩小,更加聚焦于我们要解决问题的核心。
栈的应用——递归:
斐波那契额数列:
普通函数:
递归函数:
递归定义:
把直接调用自己或通过一系列的调用语句间接地调用自己的函数称为递归函数。(必须有条件停止递归)
栈实现: 编译器使用栈来实现上面程序,在前行阶段,对于每一层递归,函数的局部变量、参数值以及返回地 址都被压入栈中,在退回阶段,位于栈顶的局部变量、参数值和返回地址被弹出,用于返回调用层次 中执行代码的其余部分,也就是恢复了调用的状态。
栈的应用——四则运算表达式的求值:
后缀(逆波兰)表示法的定义:
转化----->
计算:
中缀表达式转后缀表达式:
队列
队列的定义:
队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出的线性表(FIFO),允许插入的一端成为队尾,允许删除的一端称为队头。
队列的抽象数据模型:
循环队列:
队列的链式储存结构及实现: