问题描述:
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1,否则返回删除元素 )
解题思路:
- 通过两个栈实现一个队列,一个存放最终实现队列的数据栈,一个存放临时栈;
- 当数据栈中有数据,需要插入一个元素时,先将数据栈全部存放到临时栈,再将数据栈全部弹出,然后插入的数据添加到临时栈;
- 这时数据栈空,再将临时栈中所以元素存放到数据栈中,并弹出临时栈所以元素。
- 删除队列头部元素,直接弹出数据栈的栈顶元素即可。
注意:
- 当数据栈为空,即栈实现的队列无元素,直接入数据栈,无需其他操作;
- 当数据栈空,删除元素失败,返回-1,否则返回删除的元素。
class CQueue {
public:
CQueue()
{ }
void appendTail(int value)
{
if (!data_stack.empty())
{
while(!data_stack.empty())
{
tmp_stack.push(data_stack.top());
data_stack.pop();
}
tmp_stack.push(value);
while(!tmp_stack.empty())
{
data_stack.push(tmp_stack.top());
tmp_stack.pop();
}
}
else
{
data_stack.push(value);
}
return;
}
int deleteHead()
{
int i;
//CQueue();
if(data_stack.empty())
{
return -1;
}
i=data_stack.top();
data_stack.pop();
return i;
}
private:
stack<int> data_stack;
stack<int> tmp_stack;
};
/**
* Your CQueue object will be instantiated and called as such:
* CQueue* obj = new CQueue();
* obj->appendTail(value);
* int param_2 = obj->deleteHead();
*/