题目描述
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail
和 deleteHead
,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead
操作返回 -1 )
示例 1:
输入: ["CQueue","appendTail","deleteHead","deleteHead","deleteHead"] [[],[3],[],[],[]] 输出:[null,null,3,-1,-1]
题目解析
首先关于题目开始并没有理解题目的意思,后来看了评论,知道了他的大致意思;首先第一个数组中,CQueue是新建一个队列,所以下面输入的值就对应为空,appendTail就是在队尾插入输入数组中对应的数,deleteHead是删除队列头部并且返回删除的值,那么返回值在操作为CQueue和appendTail的时候,返回值为null。这整个操作就类似于队列的先进(appendTail)先出(deleteHead)。
题目构思
那么这个题将题目理解清楚其实思路就很清晰了。用两个栈实现队列,首先进队列操作,就直接将值push到其中一个栈sta_in中;比较复杂的就是出队列,那么如何用两个栈实现呢?
那我们得先分情况判断:
1、当sta_out这个栈为空,但是sta_in不为空,我们先把sta_in的值出栈后进入到sta_out,然后再sta_out的内容出栈;这样就实现了先进就可以先出;
2、当sta_out为空,并且sta_in也为空,说明队列此时没有内容,那么返回-1;
3、当sta_out不为空,那么就直接拿出栈顶元素返回就可以了。
题目代码
class CQueue {
private:
stack<int> sta_in,sta_out;
void exg()
{
while(!sta_in.empty())
{
sta_out.push(sta_in.top());
sta_in.pop();
}
}
public:
CQueue() {
}
void appendTail(int value) {
sta_in.push(value);
}
int deleteHead() {
if(sta_out.empty())
{
if(sta_in.empty())
{
return -1;
}
exg();
}
int out=sta_out.top();
sta_out.pop();
return out;
}
};/**
* Your CQueue object will be instantiated and called as such:
* CQueue* obj = new CQueue();
* obj->appendTail(value);
* int param_2 = obj->deleteHead();
*/