栈
- 栈是限制仅在一个位置上进行插入和删除的线性表。
- 允许插入和删除的一端称为栈顶,另一端称为栈底。
- 不含任何数据元素的栈称为空栈。
- 栈又称为后进先出(LIFO)表,后进入的元素最先出来。
首先,栈是一个线性表,元素之间具有线性关系,即前驱后继关系,其次,它是一种特殊的线性表,只能在表尾进行插入和删除操作。栈的插入操作,叫作进栈(push),删除操作,叫作出栈(pop).
由于栈是一个线性表,所以表的顺序结构和链式结构对栈来说同样适用。
栈的应用
递归
栈的很重要的一个应用就是递归的实现, 递归在调用下一次函数的过程中, 将函数的局部变量、参数、返回地址都压入栈中, 当前面一层的函数执行完后,位于栈顶的局部变量、参数、返回地址被弹出, 恢复该方法的调用时状态。
四则运算
先乘除,后加减,从左到右,先算括号内再算括号外 看似简单的四则运算问题在计算机中变得复杂
20世纪50年代,波兰科学家想到了一种不需要括号的后缀表达法,我们把它称为逆波兰。这种后缀表达法,非常巧妙地解决了程序进行四则运算的难题。
中缀表达式:9+(3-1)*3+10/2
后缀表达式:9 3 1 - 3 * + 10 2 / +
计算规则:从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到符号就将处于栈顶的两个数字出栈进行运算,然后将运算结果压入栈,继续计算,直到算出最终结果。
中缀表达式到后缀表达式的转换(逆波兰)
转换规则:从左到右遍历表达式的每个数字和符号,遇到数字就输出,若是符号,则判断其与栈顶符号的的优先级,是右括号或者优先级低于栈顶符号的,则栈顶符号依次出栈并输出,并将当前符号入栈,一直到输出最终后缀表达式为止。
例子:9+(3-1)*3+10/2
队列
- 队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
- 队列是一种先进先出(FIFO)的线性表,允许插入的一端称为队尾,允许删除的一端称为队头。
线性表有顺序存储和链式存储,队列作为一种特殊的线性表,也同样存在这两种存储方式。