用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
示例 1:
输入:
["CQueue","appendTail","deleteHead","deleteHead","deleteHead"]
[[],[3],[],[],[]]
输出:[null,null,3,-1,-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/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路1:将新加入的元素放在栈底:可以在有新元素加入时,将栈中的所有元素放入另一个栈,新元素加到栈底后,再将另一个栈中的元素转移到该栈中。
优化:由于将第一个栈的元素全部放到第二个栈后,第二个栈存储的元素本就已经是入栈的倒序,即栈顶元素即是最先加入的元素,利用这一点,可以先一直往第一个栈中添加元素。遇到删除元素的情况时,如果第二个栈非空,直接返回第二个栈的栈顶元素即可。如果第二个栈为空,则将第一个栈的全部元素的转移到第二个栈中,由于栈的特点,可以保证第二个栈的栈顶元素是最先添加到队列的元素。如果两个栈都是空,则直接返回-1即可。
优化前代码:
class CQueue { Deque<Integer> deque1; Deque<Integer> deque2; public CQueue() { this.deque1 = new LinkedList<>(); this.deque2 = new LinkedList<>(); } public void appendTail(int value) { // 将栈中的元素全部转移到另一个栈中。 transfer(true); // 将新元素加到栈底 deque1.push(value); // 将另一个栈中的元素重新转移到栈中。 transfer(false); } public int deleteHead() { // 如果为null,返回-1 if (deque1.isEmpty()) { return -1; } // 返回栈顶元素 return deque1.pop(); } private void transfer(boolean inOrOut) { if (inOrOut) { while (!deque1.isEmpty()) { deque2.push(deque1.pop()); } } else { while (!deque2.isEmpty()) { deque1.push(deque2.pop()); } } } } /** * Your CQueue object will be instantiated and called as such: * CQueue obj = new CQueue(); * obj.appendTail(value); * int param_2 = obj.deleteHead(); */
优化1:
class CQueue { Deque<Integer> deque1; Deque<Integer> deque2; public CQueue() { this.deque1 = new LinkedList<>(); this.deque2 = new LinkedList<>(); } public void appendTail(int value) { // 将新元素加到栈顶 deque1.push(value); } public int deleteHead() { if (deque2.isEmpty()) { if (deque1.isEmpty()) { return -1; } else { while (!deque1.isEmpty()) { deque2.push(deque1.pop()); } return deque2.pop(); } } else { return deque2.pop(); } } } /** * Your CQueue object will be instantiated and called as such: * CQueue obj = new CQueue(); * obj.appendTail(value); * int param_2 = obj.deleteHead(); */标签:deleteHead,元素,appendTail,Offer,CQueue,09,---,deque2,deque1 From: https://www.cnblogs.com/allWu/p/17228270.html