解题思路
用两个栈实现队列。 1.一个栈用作输入栈,一个栈用作输出栈。 2.输入数据时,直接压入第一个栈。 3.需要输出数据时,直接将第一个栈的数据全部按栈输出顺序挪到第二个栈中,输出第二个栈的栈顶即可。之后直到栈二再次为空,否则不进行栈一数据的移动。
代码
class MyQueue {
public:
MyQueue() {
}
void push(int x) {
stack1.push(x);//输入栈
}
int pop() {
//如果输出栈为空,将输入栈的数据全部移过去
if(stack2.size()==0){
while(stack1.size()!=0){
stack2.push(stack1.top());
stack1.pop();
}
//输出并删除栈顶元素
int a = stack2.top();
stack2.pop();
return a;
}
int a = stack2.top();
stack2.pop();
return a;
}
int peek() {
if(stack2.size()==0){
while(stack1.size()!=0){
stack2.push(stack1.top());
stack1.pop();
}
return stack2.top();
}
return stack2.top();;
}
bool empty() {
return stack1.size()==0 && stack2.size()==0;
}
private:
stack<int> stack1;//输入栈
stack<int> stack2;//输出栈
};
复杂度分析
时间复杂度: O(1)。对于单个数据来说,时间复杂度并不为O(1),有可能是O(n),n为队列中元素个数。但是对于存取n个数据的操作过程来说,单个数据的均摊复杂度就是O(1)。
空间复杂度: O(n)。n为队列元素个数。