pop
和push
等接口,时间复杂度都为O(1)
deque
容器题目链接:用栈实现队列
首先根据提示代码可以确定:队列只有四个操作:push、pop、peek、empty
。针对push
操作:队列push
依次,栈也push
一次。针对pop
操作:队列pop
一次,pop
的是第一个元素;栈pop
一次,pop
的是最后面的一个元素,因此行为逻辑不统一,需要将栈中元素翻转,翻转后再pop
,就和队列pop
的元素一样。针对peek
操作:队列peek
操作,返回的是队首元素,栈何队列相反,因此也要将栈中的元素翻转。针对empty
判空操作:只有当两个栈中都没有元素时,队列中才没有元素。
class MyQueue {
public:
MyQueue() {
}
void push(int x) {
stackIn.push(x);
}
int pop() {
if(stackOut.empty()){
while(!stackIn.empty())
{
stackOut.push(stackIn.top());
stackIn.pop();
}
}
int result = stackOut.top();
stackOut.pop();
return result;
}
int peek() {
int result = this->pop();
stackOut.push(result);
return result;
}
bool empty() {
if(stackIn.empty() && stackOut.empty()){
return true;
}
return false;
}
private:
stack<int> stackIn;
stack<int> stackOut;
};
题目链接:用队列实现栈
本题目和上一题目还是有一些区别的。因为队列总是先进先出,你无法翻转队列中的元素。所以当栈进行pop
操作时,将队列中前面的元素都添加到另一个队列中,然后pop
出最后一个元素。
class MyStack {
public:
MyStack() {
}
void push(int x) {
queue1.push(x);
}
int pop() {
int size = queue1.size()-1;
while(size--){
queue2.push(queue1.front());
queue1.pop();
}
int result = queue1.front();
queue1.pop();
queue1 = queue2;
while(!queue2.empty())
{
queue2.pop();
}
return result;
}
int top() {
int result = this->pop();
queue1.push(result);
return result;
}
bool empty() {
if(queue1.empty()){
return true;
}
return false;
}
private:
queue<int> queue1;
queue<int> queue2;
};
参考链接: