数据结构栈的作用
一.递归
递归:直接调用自己或通过一系列的调用语句间接地调用自己
每个递归定义必须至少有一个条件,满足递归不再进行,即不在引用自身而是返回退出
迭代与递归
迭代:循环递归:选择
迭代:不需要反复调用函数和占用额外的内存
递归:使程序结构清晰监理函数副本,耗费时间和内存
例斐波那契数列的递归函数
递归与栈
递归过程退回的顺序是他前行顺序的逆序。在退回过程中,可能要执行某些动作,包括恢复在前行过程中存储起来的某些数据。这种存储某次额数据,并在后面又以存储的逆序恢复这些数据,符合栈的数据结构。所以在前行阶段,对于每一层的递归,函数的局部变量,参数值以及返回地址都被压入栈中。在退回阶段,位于栈顶的局部变量,参数值以及返回地址被弹出,用于返回调用层次中执行代码的其余部分,也就恢复了调用的状态。
二.四则运算表达式求值
9 + (3 - 1) * 3 + 10 / 2 后缀表达式:9 3 1 – 3 * +10 2 / +
规则:从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到符号,就将处于栈顶两个数字出栈,进行运算,运算结果进栈,一直到获得结果。
队列的定义
队列:只允许在一端进行插入操作,在另一端进行删除操作的线性表。
先进先出 FIFO
队列顺序存储
假溢出:
循环队列
循环队列(头尾相连的顺序结构)解决假溢出
判断队列为空的方法
当队列空时,条件是front == rear .当队列满的时候,修改条件,保留一个元素空间。最大尺寸为queuesize . 队列满的条件是(rear +1)% queuesize == front
计算队列长度公式:(rear– front + queuesize)% queuesize
循环队列的操作
入队
出队
队列的链式存储结构= 只能尾进头出的线性表的单链表
总结回顾
栈:限定在表尾进行插入和删除操作的线性表
队列:只允许在一端进行插入操作,而在另一端进行删除操作的线性表
均可以用线性表的顺序存储结构来实现,但都存在着顺序存储的一些弊端。
对于栈,如果是两个相同数据类型的栈,则可以用数组的两端作栈底的方法来让两个栈共享数据,最大化利用数组空间。
对于队列来说,为了避免数组查如何删除要移动数据,引入循环队列,解决移动数据的时间损耗。