题目描述:
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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 次调用
来源:力扣(LeetCode)
题目分析
栈和队列是两种常见的数据结构
栈:先入后出
队列: 先入先出
解题思路
题目要求用两个栈实现队列,根据两种数据结构的特点,在队列执行添加操作时,向栈s1种压入,而在队列执行删除操作时,则将s1种元素全部弹出并逆向插入栈s2,弹出s2栈顶元素后,再将s2中元素依次压入s1
代码实现:
class CQueue { private: stack<int> s1,s2; public: CQueue() { while(!s1.empty()){ s1.pop(); } while(!s2.empty()){ s2.pop(); } } void appendTail(int value) { s1.push(value); } int deleteHead() { if(s1.empty()){ return -1; } while(!s1.empty()){ s2.push(s1.top()); s1.pop(); } int ans=s2.top(); s2.pop(); while(!s2.empty()){ s1.push(s2.top()); s2.pop(); } return ans; } }; /** * Your CQueue object will be instantiated and called as such: * CQueue* obj = new CQueue(); * obj->appendTail(value); * int param_2 = obj->deleteHead(); */