用两个栈实现一个队列。
队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
class CQueue {
public:
CQueue() {
}
void appendTail(int value) {
}
int deleteHead() {
}
};
/**
* Your CQueue object will be instantiated and called as such:
* CQueue* obj = new CQueue();
* obj->appendTail(value);
* int param_2 = obj->deleteHead();
*/
思路
一个栈a负责入队,另一个栈b负责出队(将a的全部数据出栈传入b栈中)
- sin只负责进入
- sout只负责取出
- 只有sout为空时才把sin的所有元素倾倒进sout中
- sout不为空的时候,先让sout出栈
C++代码
class CQueue {
public:
CQueue() {
}
void appendTail(int value) {
sin.push(value); //入对的时候只管存进去
}
int deleteHead() {
if(sin.empty() && sout.empty())
return -1;
if(sout.empty()) //输出栈为空时就可以把输入栈的倒进来
{
while(!sin.empty())
{
int v = sin.top();
sout.push(v);
sin.pop();
}
}
//输出栈不为空时要先出栈
int value = sout.top();
sout.pop();
return value;
}
stack<int> sin; //输入栈
stack<int> sout; //输出栈 辅助出队
};