题目要求:
编写一个类,只能用两个栈结构实现队列,支持队列的基本操作add(),poll(),peek()
题目思路:
栈是先进后出,队列是先进先出。用两个栈可以将顺序反过来,实现队列操作
设置两个栈stackPush(压入栈)和stackPop(弹出栈),一个只进行push操作,一个只进行pop操作。
将stackPush中的值都倒入到stackPop中,再从stackPop中弹出就是队列的操作了。
两个注意点:
1、从stackPush向stackPop中倒入数据时,必须将stackPush中的数据一次性全部倒完。(不然在stackPush栈底的元素(最先入栈的元素)到不了stackPop的栈顶,发生一次pop操作就会出错)
2、stackPop不为空时,不能往里面倒入数。(不然先入栈的数会在栈的底端不能按照队列性质尽快弹出)
从stackPush倒入stackPop中这个操作可以加入在add()或者poll()或者peek()中,只要不违反两个注意点即可。
代码实现:
class TwoStack {
public:
stack<int>stackPush;stack<int>stackPop;//两个栈
vector<int>result;
void push(int value){
stackPush.push(value);
}
void pop(){
result.push_back(stackPop.top());
stackPop.pop();
}
void trans(){
while(!stackPush.empty()){
stackPop.push(stackPush.top());
stackPush.pop();
}
}
vector<int> twoStack(vector<int> ope, int n) {
// write code here
for(int i = 0;i<n;i++){
if(ope[i]!=0)
push(ope[i]);
if(ope[i]==0)//在pop之前,如果stackPop为空,把stackPush中的元素倒入stackPop中
{
if(stackPop.empty())
trans();
pop();
}
}
return result;
}
};