用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
首先解释一下示例:
第一行: ["CQueue","appendTail","deleteHead","deleteHead"] 表示操作
CQueue 构造队列 appendTail 队尾入队 deleteHead 队头出队
第二行: [[],[3],[],[]] 表示入队的数字 (只有appendTail操作有对应值)
第三行输出:[null,null,3,-1]
构造队列和入队 返回 null; 出队返回 数字 或者 -1
解题思路:
加入队尾 appendTail() : 将数字 val 加入栈 1 即可。
删除队首deleteHead() : 有以下三种情况。
当栈 2 不为空: 2中仍有已完成倒序的元素,因此直接返回 B 的栈顶元素。
否则,当 1为空: 即两个栈都为空,无元素,因此返回 -1 。
否则: 将栈 1 元素全部转移至栈 1 中,实现元素倒序,并返回栈 2的栈顶元素。
class CQueue {
public:
stack<int> stk1;
stack<int> stk2;
int temp = 0;
CQueue() {
}
void appendTail(int value) {
stk1.push(value);
//return null;
}
int deleteHead() {
if(!stk2.empty()){
temp = stk2.top();
stk2.pop();
return temp;
}
if(stk1.empty()){
return -1;
}
while(!stk1.empty()){
stk2.push(stk1.top());
stk1.pop();
}
temp = stk2.top();
stk2.pop();
return temp;
}
};
/**
* Your CQueue object will be instantiated and called as such:
* CQueue* obj = new CQueue();
* obj->appendTail(value);
* int param_2 = obj->deleteHead();
*/