剑指 Offer 09. 用两个栈实现队列

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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) 
返回此列表中指定元素的第一个出现的索引,或-如果此列表不包含元素,或- 1int lastIndexOf(Object o) 
返回此列表中指定元素的最后一个发生的索引,或-如果此列表不包含元素,或- 1ListIterator<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.csdn.net/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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值