队列的定义:
队列也是一种线性表,逻辑结构与线性表相同,为一对一结构,分为顺序队列和链式队列。队列只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
栈的定义:
栈是一种线性表,限定仅在表尾进行插入和删除操作的线性表,
表尾又称为栈顶。逻辑结构与线性表相同,也为一对一结构。
线性表分为顺序表和链表,同样的栈也可以分为顺序栈和链栈。
顺序栈和链栈的区别:
顺序栈的实现在于使用了数组这个基本数据结构,数组中的元素在内存中的存储位置是连续的,且编译器要求我们在编译期就要确定数组的大小,这样对内存的使用效率并不高。
一来无法避免因数组空间用光而引起的溢出问题
二在系统将内存分配给数组后,则这些内存对于其他任务就不可用;
而对于链栈而言,使用了链表来实现栈,链表中的元素存储在不连续的地址,由于是动态申请内存,所以我们可以以非常小的内存空间开始,另外当某个项不使用时也可将内存返还给系统。
顺序存储结构是在内存中开辟一个连续的空间用来存储数据,因此对于内存的需求和苛刻,必须是连续的空间.在数据查找(特别是不按照规律排列的数据),时间复杂度教少.效率高.
链式存储结构是采取连表指针来指示数据的存储位置,这就可以是在内存中随意的存储,没有必须连续储存空间的要求,对于内存的要求相对教容易.但是要是是从小到大顺序排列的数据。
链式存储结构的时间复杂度教小,效率高.但是要是不规则排布的数据一般时间复杂度较高,效率更低。
总结:顺序栈是数组实现,链式栈是链表实现。 顺序栈内存空间是连续的。链式栈内存空间是不连续的
栈的应用:
- 表达式求值:
前缀表达式和后缀表达式的应用:
假如有个表达式 3+4 * ( 3 -2)。现在你想让计算机把这个式子算出来。你怎么办呢?大多数语言可以读一个int,可以读一个char字符,可以读一个字符串(即"3+4*(3-2)"),但是具体的逻辑处理还是要靠我们写。其实这个程序不是很好编写的,可能要用到大量的堆栈处理逻辑,比如如果是+号就入栈,如果是就出栈到某一种东西在栈顶为止,加上括号的存在就更难办了。再考虑一般情况,可能还有各种其他的取余啊什么的符号,还有优先级,很难搞的。但是要是是后缀的就很简单了,比如3,4,3,2,-,,+,程序只要是把遇到的数都存起来,然后遇到符号就计算前两个数的结果就可以了。一个循环就可以搞定要是都是后缀的对计算机多友好啊!但是显然中缀更符合人们的表达习惯。所以要是能把中缀写程序转成后缀就好了。其实到这里已经对后缀的存在合理性有了认识了。用处在于去掉表达式的括号,即隐藏操作符优先级。
- 进制转换
- 递归调用