一上一下
推理思路:因为栈只能控制一头,而队列需要控制两头,所以需要两个栈。一个栈控制队头,另一个栈控制队尾。就像把两个栈上下合并起来,组成一个两端开口的队列。上面的栈控制队头,有删除队头的功能,下面的栈控制队尾,负责添加队尾元素。只不过这样合并的栈有个问题,就是中间有层隔阂,为两个栈的栈底。那么对于删除头元素时,这层隔阂是有影响的,对于添加队尾元素无影响。因为当我们删除头元素删到栈底时,但下面的栈还有元素,此时到栈底了却删不了。那么很显然,当队头删除到栈底时,解决办法就是将下面栈的元素移到上面的栈里面即可。
123456789101112131415161718192021222324252627282930313233
class CQueue {public: CQueue() { } void appendTail(int value) { tail.push(value); } int deleteHead() { if(front.empty() && tail.empty()) return -1; if(front.empty()){ while(!tail.empty()){ front.push(tail.top()); tail.pop(); } } int dle=front.top(); front.pop(); return dle; }private: stack<int> front,tail;};/** * Your CQueue object will be instantiated and called as such: * CQueue* obj = new CQueue(); * obj->appendTail(value); * int param_2 = obj->deleteHead(); */