用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
示例 1:
输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
输出:[null,null,3,-1]
示例 2:
输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
提示:
1 <= values <= 10000
最多会对 appendTail、deleteHead 进行 10000 次调用
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目解析:
两个栈实现队列
入栈:
入栈到第一个栈中
出栈:
第二个栈用来出栈的,
当第二个栈中没有元素,第一个栈中有元素便执行:将第一个栈中的元素出栈并同时入栈到第二个栈中,实现转置的效果,此时将第二个栈中的元素出栈,相当于是队列的头出队了,其他的不变
当第二个栈中没有元素,第一个栈也没有元素,即-1
class CQueue {
LinkedList<Integer> stack1;
LinkedList<Integer> stack2;
public CQueue() {
stack1 = new LinkedList<>();
stack2 = new LinkedList<>();
}
public void appendTail(int value) {
stack1.push(value);
}
public int deleteHead() {
if(stack2.isEmpty()){
if(stack1.isEmpty()) return -1;
while(!stack1.isEmpty()){
stack2.push(stack1.pop());
}
return stack2.pop();
}
else return stack2.pop();
}
}
/**
* 解释是如何调用的
* Your CQueue object will be instantiated and called as such:
* CQueue obj = new CQueue();
* obj.appendTail(value);
* int param_2 = obj.deleteHead();
*/
LinkedList的底层为一个双向链表,且LinkedList类实现了List和Deque,说明其兼具两者的属性.
LinkedList xxx = new LinkedList<>();
LinkedList方法摘要
Modifier and Type Method and Description
boolean add(E e)
将指定的元素列表的结束。
void add(int index, E element)
在列表中指定的位置上插入指定的元素。
boolean addAll(Collection<? extends E> c)
追加指定集合的所有元素到这个列表的末尾,按他们的指定集合的迭代器返回。
boolean addAll(int index, Collection<? extends E> c)
将指定集合中的所有元素插入到该列表中,从指定位置开始。
void addFirst(E e)
在此列表的开始处插入指定的元素。
void addLast(E e)
将指定的元素列表的结束。
void clear()
从这个列表中移除所有的元素。
Object clone()
返回该 LinkedList浅拷贝。
boolean contains(Object o)
返回 true如果这个列表包含指定元素。
Iterator<E> descendingIterator()
返回在反向顺序在deque容器元素的迭代器。
E element()
检索,但不删除,此列表的头(第一个元素)。
E get(int index)
返回此列表中指定位置的元素。
E getFirst()
返回此列表中的第一个元素。
E getLast()
返回此列表中的最后一个元素。
int indexOf(Object o)
返回此列表中指定元素的第一个出现的索引,或-如果此列表不包含元素,或- 1。
int lastIndexOf(Object o)
返回此列表中指定元素的最后一个发生的索引,或-如果此列表不包含元素,或- 1。
ListIterator<E> listIterator(int index)
返回此列表中元素的列表迭代器(在适当的顺序),从列表中的指定位置开始。
boolean offer(E e)
将指定的元素添加到列表的尾部(最后一个元素)。
boolean offerFirst(E e)
在列表的前面插入指定的元素。
boolean offerLast(E e)
在列表的结尾插入指定的元素。
E peek()
检索,但不删除,此列表的头(第一个元素)。
E peekFirst()
检索,但不删除该列表的第一个元素,或返回 null如果这个列表是空的。
E peekLast()
检索,但不删除该列表的最后一个元素,或返回 null如果这个列表是空的。
E poll()
检索并删除此列表的头(第一个元素)。
E pollFirst()
检索并移除此列表的第一个元素,或返回 null如果这个列表是空的。
E pollLast()
检索并移除此列表的最后一个元素,或返回 null如果这个列表是空的。
E pop()
从这个列表所表示的堆栈中弹出一个元素。
void push(E e)
将一个元素推到由该列表所表示的堆栈上。
E remove()
检索并删除此列表的头(第一个元素)。
E remove(int index)
移除此列表中指定位置的元素。
boolean remove(Object o)
从该列表中移除指定元素的第一个发生,如果它是存在的。
E removeFirst()
移除并返回此列表中的第一个元素。
boolean removeFirstOccurrence(Object o)
删除此列表中指定元素的第一个出现(当遍历从头到尾的列表)。
E removeLast()
移除并返回此列表中的最后一个元素。
boolean removeLastOccurrence(Object o)
删除此列表中指定元素的最后一次(当遍历从头到尾的列表时)。
E set(int index, E element)
用指定元素替换此列表中指定位置的元素。
int size()
返回此列表中元素的数目。
Spliterator<E> spliterator()
创建一个后期绑定和快速失败 Spliterator超过此列表中的元素。
Object[] toArray()
返回一个数组,包含在这个列表中的所有元素在适当的顺序(从第一个到最后一个元素)。
<T> T[] toArray(T[] a)
返回一个数组,包含在这个列表中的所有元素在适当的顺序(从第一到最后一个元素);返回数组的运行时类型是指定的数组的运行时类型。
LinkedList具体用法
https://blog.youkuaiyun.com/linZinan_/article/details/114604893?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165166561416782184677060%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=165166561416782184677060&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-2-114604893.142v9pc_search_result_control_group,157v4control&utm_term=LinkedList%3Cinteger%3E&spm=1018.2226.3001.4187