剑指 Offer 09. 用两个栈实现队列
个人思路
题意
深入队列底层实现,用两个栈实现队列的插入和删除操作
思路
个人思路
- 插入时:先把元素push进栈1,再将栈1中的所有元素挪到栈2中,此时栈2中的top即为队首元素(此处理解错题意了,插入时,题目并不要求显示出队列中元素的正确顺序,其实题目只要求删除时能先删掉最先入队的元素即可,并有返回值)
- 删除时:先将栈1中的元素都挪到栈2中,再删去栈顶元素(最先入队的元素),再将剩余元素挪回栈1
void appendTail(int value) {
if(s1.empty()){
s2.push(value);
while(!s2.empty()){
int top = s2.top();
s2.pop();
s1.push(top);
}
}
}
正确思路
- 一个栈作为队列存储容器栈1,一个栈作为辅助栈2
- 插入时:直接push进栈1即可
- 删除时:先将栈1中的元素都挪到栈2中,再删去栈顶元素(最先入队的元素),再将剩余元素挪回栈1
个人思路代码
class CQueue {
private:
stack<int> s1;//作为辅助
stack<int> s2;//作为队列容器
public:
CQueue() {
}
void appendTail(int value) {
s2.push(value);
}
int deleteHead() {
int ans = -1;
if(s1.empty() && !s2.empty()){
while(!s2.empty()){//将s2的元素挪入s1,从s1中删去
s1.push(s2.top());
s2.pop();
}
ans = s1.top();
s1.pop();
while(!s1.empty()){//还原到s2
s2.push(s1.top());
s1.pop();
}
return ans;
}
return ans;
}
};