栈(Stack)是限定仅在表尾进行插入和删除操作的线性表。
把允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的栈称为空栈。栈又称为后进先出的线性表,简称LIFO结构。
栈的插入操作,叫做进栈,也称压栈、入栈。
栈的删除操作,叫做出栈,也称弹栈。
当两个栈一个占用内存可能太大 但内容较少 另一个占用内存可能有剩余 可以考虑使用一个数组来存两个栈,一个底端从下标0开始,另一个底端从下标n-1开始,只要两个栈不碰头 就可以实现空间的有效利用。
栈的链式存储结构称为栈链。
如果栈的使用过程中元素变化不可预料,有时很小,有时很大,那么最好用链栈,繁殖,如果变化可控,可以使用顺序栈。
C#中自带了Stack类,封装了一些方法,比如push和pop 压栈和弹栈。
我们把一个直接调用自己或通过一系列的调用语句间接的调用自己的函数,称作递归函数。
每个递归定义必须有一个出口,满足时递归不再进行,即不再引用自身而是返回至退出。
不带括号的后缀表达法,又称逆波兰。所有的运算符号都在运算数字后面出现。可利用栈实现。
例 931-3*+102/+ 后缀表达式。可以把每一个符号理解为一个括号。 为 9+(3-1)*3+10/2
标准的四则表达式称为标准运算四则表达式中缀表达式。
队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
队列是一种先进先出的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。
当队头等于队尾,为空队列。
为了解决假溢出,采用头尾相接的数据结构即循环队列。
满队列的条件为队头加上队列数据的个数等于队尾。
队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已,称为链队列。
从空间上来说,循环队列必须有一个固定的长度,所以就有了存储元素个数和空间浪费的问题。而链队列需要开辟一块指针域,却不会有太大影响。