力扣:用两个栈实现一个队列
题目:
剑指 Offer 09. 用两个栈实现队列
难度简单708收藏分享切换为英文接收动态反馈
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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
次调用
第一个对法:
无视题目要求直接用内置函数(我这个屑)
class CQueue {
queue<int> q;
public:
CQueue() {
}
void appendTail(int value) {
q.push(value);
}
int deleteHead() {
if(q.empty())return -1;
int ans = q.front();
q.pop();
return ans;
}
};
/**
* Your CQueue object will be instantiated and called as such:
* CQueue* obj = new CQueue();
* obj->appendTail(value);
* int param_2 = obj->deleteHead();
*/
第一种错法:
class CQueue {
private:
stack<int> a1;
stack<int> a2;
public:
CQueue() {
}
void appendTail(int value) {
a1.push(value);
}
int deleteHead() {
while(!a1.empty()){
a2.push(a1.top());
a1.pop();
}
if(!a2.empty()){
int ans = a2.top();
a2.pop();
return ans;
}
else return -1;
}
};
/**
* Your CQueue object will be instantiated and called as such:
* CQueue* obj = new CQueue();
* obj->appendTail(value);
* int param_2 = obj->deleteHead();
*/
这里是因为每次删除一个元素的时候都把第一个栈的元素放到第二个栈那里,其实是只能在第二个栈空的时候再把第一个栈的全部元素都放进去,不然会破坏了第二个栈的顺序
第二种对法:
class CQueue {
private:
stack<int> a1;
stack<int> a2;
public:
CQueue() {
}
void appendTail(int value) {
a1.push(value);
}
int deleteHead() {
if(a2.empty()){
while(!a1.empty()){
a2.push(a1.top());
a1.pop();
}
}
if(!a2.empty()){
int ans = a2.top();
a2.pop();
return ans;
}
else return -1;
}
};
/**
* Your CQueue object will be instantiated and called as such:
* CQueue* obj = new CQueue();
* obj->appendTail(value);
* int param_2 = obj->deleteHead();
*/