目录
栈(Stack)
一种严格按照先进后出(First In Last Out)FILO、后进先出(Last In First Out ) LIFO模式的一种容器结构
Stack、FILO、LIFO都指的是一个东西。
bottom:最底层的元素 top:最上面的元素 push:压栈 pop:弹出 peek:查看但不取出栈顶元素
队列(Queue)
严格遵守先进先出(First In First Out) FIFO 的一种容器结构。最常见实现还是通过线性结构实现
offer(放入队列):隐含着放入队尾 poll(取出元素):隐含从队首取出元素 peek(查看但不删除队首元素)
假如用线性表实现:队首并不要求一定是线性表的开始,同理,队尾也并不要求必须是线性表的结尾。
1、2 的操作 或者 3、4的操作:栈
1、4的操作 或者 3、2的操作: 队列
一、 队列中的一些操作:
bollean offer(E e) 把元素放入队列(放入队尾) 失败:return false; 时间复杂度:O(1)
E poll( ) 取出队首元素(同时从队列中删除该元素) 失败:return null; 时间复杂度:O(1) 使用之前先使用 isEmpty() 或者 size() 判断之后,就不会遇到失败的情况(队列为empty)
E peek( ) 查看队首元素(不从队列中删除) 失败:return null; 时间复杂的:O(1) 使用在 isEmpty() 或者 size() 判断之后
二、队列的容量问题
队列并没有要求过是否有容量上限,所以具体实现时,可以有容量上限也可以没有
比如:如果 LinkedList 实现的队列没有容量上限。但用 ArrayDeque 实现的队列,是有容量上限的。如果容量上限,则达到容量上限时,插入失败,以 return false 来体现。
三、JDK 中提供的栈和队列
栈:
Deque<String> stack = new LinkedList();
stack.isEmpty(); stack.size(); stack.push(e); e = stack.pop(); e = stack.peek();
队列:
Queue<String> queue = new LinkedList();
queue.isEmpty(); queue.size(); queue.offer(e); e = queue.poll(); e = queue.peek();
四、栈和队列的使用场景
栈:需要方向序列时,可以想到栈 1、2、3、4 -> 4、3、2、1
需要回溯的时候,可以想到栈 家 -> 学校 -> 商场 -> 饭店
饭店 -> 商场 -> 学校 -> 家
需要深度优先遍历时候,可以想到栈
队列:需要公平性、需要广度优先遍历时候,可以想到队列
五、自己实现栈和队列
栈:可以用顺序表(优先),也可以用链表实现
顺序表:尾删和尾插的时间复杂度都是O(1)
链表:如果是双向链表,头尾都可以;如果是单向链表,头删、尾插(多维护一个尾结点即可)