栈
1、是什么
栈是一种操作受限的线性表,只允许在一端删除和添加数据。
2、为什么
特定的数据结构是对特定使用场景的抽象,数组和链表暴露的接口太多,操作灵活自由,但是使用起来不可控,容易出错。
3、怎么实现
栈可以数组和链表实现。数组实现叫做顺序栈,链表实现叫做链式 栈。存储数据只需要大小为n的数组就够了,出栈和入栈过程中,只需要一两个临时变量存储空间,空间复杂度是O(1)。出栈和入栈时间复杂度都是O(1)。支持动态扩容的顺序栈,入栈最 好情况时间复杂度是O(1),最坏O(n),平均时间复杂度是O(1).均摊时间复杂度一般都是最好情况时间复杂度。
一、自身特点
先进后出、后进先出。
二、适合解决的问题
某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,用栈这种数据结构。
三、实际的应用场景
函数调用、表达式求值、括号匹配
队列
1、是什么
队列是一种操作受限的线性表,入队放一个元素到对尾,出队从队列头部取一个元素。
2、为什么
特定的数据结构是对特定使用场景的抽象,数组和链表暴露的接口太多,操作灵活自由,但是使用起来不可控,容易出错。
3、怎么实现
队列可以数组和链表实现。数组实现叫做顺序队列,链表实现叫做链式队列。出队和入栈时间复杂度都是O(1)。基于链表实现方法,入队tail->next=new_node,tail=tail->next.
数组实现队列时tail=n,会数据搬移,这样入队操作性能会受影响。把数组的首尾相连就是循环队列。写循环队列的实现需要注意的是队空head=tail和队满(tail+1)%n=head的判定条件。队满时,tail指向的位置实际是不存储数据的,所以会浪费一个数组的存储空间。
一、自身特点
先进先出,在对尾插入插入元素,在对头删除元素。
二、适合解决的问题
线程池请求排队,用于任何有限资源池,用于排队请求。对于大部分资源有限的场景,没有空闲资源时,基本都可以用“队列”这种数据结构来实现请求排队。
三、实际的应用场景
应用广泛,特别是一些有特定额外特性的队列,比如循环队列、阻塞队列、并发队列。在很多偏底层系统、框架、中间件的开发中,起关键作用。