题目描述
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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 次调用
思路
队列是先进先出的数据结构,栈是先进后出的数据结构,怎么使用栈完成队列的功能?
对一个空栈来说,先压入全部数据,然后弹出所有数据,就完成了一次数据的反序,例如输入数组[1, 7, 3]
,弹出时就变成了[3, 7, 1]
。可见如果使用一个栈+一个辅助栈,进行两次反序,就可以完成队列的功能。当然,这道题在这个基础上还是要更复杂一些,上面是假设一下压入全部数据,然后一下弹出所有数据的情况。本题还要注意:
- s1与s2全空又要“出队列”时,返回-1
- "出队列"时,保证辅助栈已经全为空,然后将原栈所有元素灌入辅助栈后,再依次出栈即可
题解
c++
CQueue.h
#include<stack>
using namespace std;
class CQueue {
stack<int> s1, s2;
public:
CQueue() {
stack<int> s1;
stack<int> s2;
}
void appendTail(int value) {
s1.push(value);
}
int deleteHead() {
if (s2.empty()) { /*要保证s2是空栈才正确*/
while (!s1.empty()) {
s2.push(s1.top());
s1.pop();
}
}
if (s2.empty())
return -1;
else {
int temp = s2.top();
s2.pop();
return temp;
}
}
};
Java
CQueue.java
package com.leetcode.CQueue;
import java.util.Stack;
class CQueue {
Stack<Integer> s1,s2;
public CQueue() {
s1 = new Stack<Integer>();
s2 = new Stack<Integer>();
}
public void appendTail(int value) {
s1.push(value);
}
public int deleteHead() {
if(s2.empty()){
while(!s1.empty()){
s2.push(s1.pop());
}
}
if(s2.empty())
return -1;
return s2.pop();
}
}
复杂度分析
时间复杂度 | 空间复杂度 |
---|---|
O(1) | O(n) |
时间复杂度: 加入元素时显然为O(1);删除时由于每一步最多只能删除一个元素,所以复杂度也为O(1)
空间复杂度: 加入n个元素并且不删除时占空间O(n),因而空间复杂度为O(n)