题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
示例 1:
输入:
[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”,“deleteHead”]
[[],[3],[],[],[]]
输出:[null,null,3,-1,-1]
示例 2:
输入:
[“CQueue”,“deleteHead”,“appendTail”,“appendTail”,“deleteHead”,“deleteHead”]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
提示:
1 <= values <= 10000
最多会对 appendTail、deleteHead 进行 10000 次调用
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof
思路:
1.构建两个空的栈,一个实现输入,另一个实现输出;
2.先将元素压入输入栈,此时输入栈的元素顺序是倒序的;
3.将输入栈的元素压入输出栈,此时输出栈的元素顺序是顺序的,将元素一一取出即可实现队列。
class CQueue {
public:
// 定义两个栈,一个实现输入,另一个实现输出
stack<int> stIn;
stack<int> stOut;
// 用于清空两个栈
CQueue() {
while(!stIn.empty())
{
stIn.pop();
}
while(!stOut.empty())
{
stOut.pop();
}
}
// 将元素压入输入栈
void appendTail(int value) {
stIn.push(value);
}
int deleteHead() {
if(stOut.empty())
{
// 如果stOut是空的就把stIn的值压入stOut内,原本输入的元素是倒序,根据栈的先进后出原则,
// 进入stOut再出来就成了正序,实现了队列的先进先出原则
while(!stIn.empty())
{
stOut.push(stIn.top());
stIn.pop();
}
}
// 根据题意:若队列中没有元素,deleteHead 操作返回 -1
if(stOut.empty())
{
return -1;
}
else{
int res = stOut.top();
stOut.pop();
return res;
}
}
};
/**
* Your CQueue object will be instantiated and called as such:
* CQueue* obj = new CQueue();
* obj->appendTail(value);
* int param_2 = obj->deleteHead();
*/