用两个栈来实现队列
今天开始是我第一天在Leetcode上写题,我打算坚持保证每天至少一道,所以,我会通过每天一篇博客的方式来记录,并加以监督,话不多说,开始今天的练习。
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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 次调用
class CQueue {
public:
CQueue() {}
void appendTail(int value) {
}
int deleteHead() {
}
};
这是给出的代码片段
思路:
加入队尾 appendTail()函数: 将数字 val 加入栈 Fr即可。
删除队首deleteHead()函数: 有以下三种情况:
当栈 Re不为空: Re中仍有已完成倒序的元素,因此直接返回 Re的栈顶元素。
否则,当 Fr为空: 即两个栈都为空,无元素,因此返回 −1 。
否则: 将栈 Fr 元素全部转移至栈 Re 中,实现元素倒序,并返回栈 Re 的栈顶元素。
代码实现
class CQueue {
public:
stack<int> Fr,Re;
CQueue() {
}
void appendTail(int value) {//添加就直接在正的栈压入就行
Fr.push(value);
}
int deleteHead() {
if(Re.empty()){ //倒的栈(reserve)为空,就把正的栈(front)弹出并压入倒的栈
while(!Fr.empty()){
Re.push(Fr.top());
Fr.pop();}
}
if(Re.empty()){ //倒的栈还为空,就说明无元素,输出-1
return -1;
}
else{ //其他情况直接弹出倒的栈
int res=Re.top();
Re.pop();
return res;
}
}
};
时间复杂度:我们可以看出appendTail()函数为 O(1);deleteHead() 函数在 N次队首元素删除操作中总共需完成 N 个元素的倒序。
空间复杂度:很明显我们用的了两个栈,所以空间复杂度为O(n)。