栈(stack):限定仅在线性表表尾进行插入和删除操作的线性表
允许插入和删除的一端称为栈顶;另一端称为栈尾,后进先出,简称LIFO结构
栈的插入操作叫做进栈,也称圧栈,入栈
栈的删除操作叫做出栈,也有的叫做弹栈
两栈共享空间是在数组的两端,让他们向中间靠拢 两指针相差1为栈满
对于栈来说,如果是两个相同数据类型的栈,则可以通过数组的两端作为栈底的方法让两个栈共享数据,这样就可以最大化的利用数组的空间.
链栈是不需要头结点的.
顺序栈需要事先确定一个固定的长度,存在内存空间问题浪费问题,优势是存取时定位很方便
链栈是要求每一个元素都有指针域,增加一些内存开销,优势是对于栈的长度无限制
栈的应用:递归--------裴波那契数列实现
int Fbi(int i)
{
If(i<2)
return i==0?0:1;
return Fbi(i-1)+Fbi(i-2);//这里的Fbi就是函数自己,它在调用自己*
}
递归:直接调用自己或通过一系列的调用语句间接的调用自己的函数,称作递归函数
每个递归定义必须至少有一个条件,满足时递归不再进行,即不再引用自身而是返回值退出
栈的应用:四则运算表达式求职
逆波兰表示:一种不需要括号的后缀表达法称为逆波兰表示(RPN)
队列(Queue):允许在一端进行插入操作,而在另一端进行删除操作的线性表
允许插入的一端叫做队尾,允许删除的一端称为队头
循环队列:把这种头尾相接的顺序存储结构称为循环队列
优点:解决移动数据的时间损耗,时间复杂度O(n)变成O(1)
循环队列和链队列差异?
时间上,基本操作都是O(1);不过循环队列是事先申请好空间,使用期间不释放,对于链队列,每次申请和释放结点也会存在一些时间开销
空间上,循环队列必须有一个固定的长度,所以就有了存储元素个数和空间浪费的问题,而链队列不存在这个问题,尽管他需要一个指针域,产生空间上的开销