剑指offer09.用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
思路:由于栈是后进先出,所以两个栈分别表示队列的顺序和逆序,进队时进顺序的栈,出队是出逆序的栈。像两个桶倒来倒去为了拿头和尾。为了优化,不用每次入队出队交替时都进行顺序和逆序的转换,入队直接加入到顺序栈,出队时若逆序栈不为空则直接出栈,为空则说明之前的一部分已出完,此时再将顺序栈的元素依次出栈并入栈到逆序栈。
代码:
class CQueue {
private:
stack<int> order;
stack<int> reverse;
public:
CQueue() {
}
void appendTail(int value) {//入队
order.push(value);
}
int deleteHead() {
if(reverse.empty()){//逆序栈是否为空
while(!order.empty()){//逆序栈为空则将顺序栈的元素依次入栈
reverse.push(order.top());
order.pop();
}
}
if(reverse.empty())//没有元素返回-1
return -1;
int num=reverse.top();
reverse.pop();
return num;
}
};
/**
* Your CQueue object will be instantiated and called as such:
* CQueue* obj = new CQueue();
* obj->appendTail(value);
* int param_2 = obj->deleteHead();
*/