题目
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )示例 1:
输入: [“CQueue”,“appendTail”,“deleteHead”,“deleteHead”] [[],[3],[],[]]
输出:[null,null,3,-1] 示例 2:输入:
[“CQueue”,“deleteHead”,“appendTail”,“appendTail”,“deleteHead”,“deleteHead”]
[[],[],[5],[2],[],[]] 输出:[null,-1,null,null,5,2] 提示:1 <= values <= 10000 最多会对 appendTail、deleteHead 进行 10000 次调用
我的想法就是:(如有错漏,请指正)
栈有先进后出 的特性。要利用栈实现队列是先进先出的话,你让栈A负责队列的入口,当栈B负责队列的出口,每当栈B为空的时候,再将栈A pop进去栈B,栈B现在就逆序,再利用栈的特性,就能实现队列先进先出。
栈B不为空的时候,不能将栈A pop进去栈B。
class CQueue {
public:
CQueue() {
}
void appendTail(int value) {
aStack.push(value);
}
void copyFromStack(stack<int> & stack1,stack<int>& stack2)
{
while (!stack2.empty()){
int top=stack2.top();
stack1.push(top);
stack2.pop();
}
}
int deleteHead() {
if(bStack.empty())
{
if(aStack.empty())
{
return -1;
}
copyFromStack(bStack,aStack);
/* while (!aStack.empty()){ // 1 -> 2
int tmp = aStack.top();
aStack.pop();
bStack.push(tmp);
}*/
}
int data=bStack.top();
bStack.pop();
return data;
}
private:
stack<int> aStack;
stack<int> bStack;
};