原题链接
题解
题目的大意就是利用两个栈来模拟队列的插入和删除,最容易想到的就是声明两个栈a, b,a这个栈用来做插入,b用来做删除作用。
当我们数据插入到栈中的,栈中的数据顺序是和删除的顺序相反的,①这就可以利用b这个栈了,将a中的数据弹出,依次压入b中,那么b中就是删除的顺序了。
②当我们删除的时候,只要b中不为空,直接将b的栈顶弹出并返回,③反之重复①②操作,如果b还是空,则返回-1
代码如下
class CQueue {
public:
stack<int> a, b;//a是插入数组,b是删除数组
CQueue() {
}
void appendTail(int value) {
a.push(value);
}
int deleteHead() {
if(b.size() == 0){//当b中没有数据的时候,才需要将a中的数据给b,那么b中就存在删除的序列
while(a.size()){
b.push(a.top());
a.pop();
}
}
if(b.size()){
int res = b.top();
b.pop();
return res;
}
else return -1;
}
};
/**
* Your CQueue object will be instantiated and called as such:
* CQueue* obj = new CQueue();
* obj->appendTail(value);
* int param_2 = obj->deleteHead();
*/
开始的时候,自己写的时候,在做完删除之后,还把b中现有的数据还给了a中了,然后每一次删除的时候都要两个栈来回换,其实,直接可以把删除的序列直接放在b中,当b为空的时候,才将a中的给b就可以了