第 1 天栈与队列(简单)
难度简单
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数
appendTail
和deleteHead
,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead
操作返回 -1 )
示例 1:
输入: ["CQueue","appendTail","deleteHead","deleteHead"] [[],[3],[],[]] 输出:[null,null,3,-1]
解题思路提示:
class CQueue {
LinkedList<Integer> A,B;
public CQueue() {
A =new LinkedList<Integer>();
B =new LinkedList<Integer>();
}
public void appendTail(int value) {
//队列尾部插入整数
A.add(value);
}
public int deleteHead() {
// 队列头部删除整数的功能
if(!B.isEmpty()){return B.removeLast();}
//队列中没有元素,deleteHead 操作返回 -1
if(A.isEmpty()){
return -1;
}
while(!A.isEmpty()){
B.add(A.removeLast());}
return B.removeLast();
}
}
如果你使用Stack的方式来做这道题,会造成速度较慢; 原因的话是Stack继承了Vector接口,而Vector底层是一个Object[]数组,那么就要考虑空间扩容和移位的问题了。 可以使用LinkedList来做Stack的容器,因为LinkedList实现了Deque接口,所以Stack能做的事LinkedList都能做,其本身结构是个双向链表,扩容消耗少。
但是,Vector Stack 这些 Java 集合框架中已经被“遗弃”, Stack 已经被 Java 官方说明不推荐使用了
Stack知识补充
结构:队列数组
特点:线程安全,是Vector的子类,有自己特有的方法
boolean | empty() 测试堆栈是否为空。 |
E | peek() 查看堆栈顶部的对象,但不从堆栈中移除它。 |
E | pop() 移除堆栈顶部的对象,并作为此函数的值返回该对象。 |
E | push(E item) 把项压入堆栈顶部。 |
int | search(Object o) 返回对象在堆栈中的位置,以 1 为基数。 |
LinkedList知识补充
结构:双向链表
特点:线程不安全,插入删除快,查询慢
常用方法:
名称 | 概述 | 备注 |
add(E e) | 添加 | 向集合中最后添加一个元素 |
add(int index ,E e) | 插入 | |
addAll(Collection c) | 批量添加 | |
addFirst(E e) | 插入到第一个 | |
addLast(E e) | 插入到最后一个 | 同add(E e) |
remove(int index) | 删除 | 按照索引删除 |
remove(E e) | 删除 | 按照内容删除 |
removeFirst() | 移除并返回此列表的第一个元素 | |
removeLast() | 移除并返回此列表的最后一个元素 | |
clear() | 清空 | |
E e = get(int index) | 获取到指定位置(索引)的元素 | |
E e = getFirst() | 获取第一个 | |
E e = getLast() | 获取最后一个 | |
set(int index,E e) | 修改 | 修改指定位置的元素 |
int size = size() | 获取集合长度 | |
Object[]array = list.toArray() | 将集合转换成数组 |
E | pop() 从此列表所表示的堆栈处弹出一个元素。 |
void | push(E e) 将元素推入此列表所表示的堆栈。 |
用作复习参考博客,不喜勿喷!