两个栈实现队列操作
利用两个栈去设计并实现一个自定义队列MyQueue。自定义队列MyQueue应当支持一般队列支持的所有操作(push , pop , peek, empty)。栈应当选择1中的顺序栈,自定义队列可自行考虑是否需要设置头尾指针。简单起见,只需考虑int数据类型的情况。
实现MyQueue类:
- void push(int x)将元素x推到队列的末尾
- int pop() 移除并返回队列开头元素
- int peek() 返回队列开头元素
- int empty() 如果队列为空返回1否则返回0
思路:
先偷一波图描述一下两个栈的作用:
栈的特点是后进先出,而队列刚好相反是先进先出,因此我们可以利用A对入队的元素进行存储,在需要出队和去栈顶元素的时候将A中的元素放到B中实现一个逆序,然后再出队或者取栈顶元素,最后再将B中的元素返回到A中。(栈B的作用便是实现逆序)
代码如下:
void Push(int x){
Stack1.push(x);
}
int Pop(){
while(!Stack1.empty())
{
Stack2.push(Stack1.top());
Stack1.pop();
}
int temp = Stack2.top();
Stack2.pop();
while(!Stack2.empty())//操作结束后一定要把元素返回栈1中,否则1就空了
{
Stack1.push(Stack2.top());
Stack2.pop();
}
return temp;
}
int Peek(){
while(!Stack1.empty()){
Stack2.push(Stack1.top());
Stack1.pop();
};
int temp = Stack2.top();
while(!Stack2.empty()){
Stack1.push(Stack2.top());
Stack2.pop();
};
return temp;
}
int Empty(){
if(Stack1.empty()&&Stack2.empty()){
return 1;
}
return 0;
}