题目描述:
用两个栈实现一个队列
队列的声明如下:
template<typename T> class Queue{
public:
void appendTail(const T& node);
T deleteHead();
private:
stack<T> stack1;
stack<T> stack2;
实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入节点和在队列头部删除节点。
分析:
以两个栈作为辅助空间,当要插入节点时,往stack1中压入。当要删除节点时,将stack1中的元素出栈,并加入到stack2中。然后stack2的栈顶元素即可看做队列的头部。
示例:
插入元素1、2、3、4,首先将这些元素都压入stack1中,则stack1中从栈顶往下依次为4、3、2、1,;
当要删除队列头部元素时,首先将stack1中元素都压入stack2中,则stack2从栈顶往下依次为1、2、3、4,然后栈顶元素1即为队列的头部元素
代码:
template<typename T>
void Queue<T>::appendTail(const T& node){
stack1.push(node);
}
template<typename T>
T Queue<T>::deleteHead(){
if(stack2.empty()){
while(!stack1.empty()){
T& elem=stack1.top();
stack1.pop();
stack2.push(elem);
}
}
if(stack2.empty()) return throw new exception("empty stack");
T elem=stack2.top();
stack2.pop();
return elem;
}
相关题目:
1、用两个队列实现一个栈 (leetcode225)
分析:
入栈和出栈的顺序是相反的,因此用两个队列存储元素时要实现元素的逆序。
因此必须始终保持一个队列为空,当要压入元素时,先将其加入到空队列的头部,然后将另一个队列的元素一个一个的加入到这个队列中。
示例:
1)加入元素1,则q1中为1
2)加入元素2,q2为空,先将其加入q2,再将q1的元素依次加入q2,则q2为1、2
3)加入元素3,q1为空,先将其加入q1,再将q2的元素依次加入q1,则q1为1、2、3
对于栈来说,此时栈顶元素为3,栈底元素为1。即stack.top()为3.而此时刚好q1.front()也为3.
代码:
class Stack {
public:
void push(int x) {
if(q1.empty()){
q1.push(x);
while(!q2.empty()){
int elem=q2.front();
q2.pop();
q1.push(elem);
}
}else{
q2.push(x);
while(!q1.empty()){
int elem=q1.front();
q1.pop();
q2.push(elem);
}
}
}
void pop() {
if(empty()) return;
if(q2.empty()) q1.pop();
else q2.pop();
}
int top() {
if(empty()) return -1;
if(q2.empty()){
return q1.front();
}else{
return q2.front();
}
}
bool empty() {
return q1.empty()&&q2.empty();
}
private:
queue<int> q1;
queue<int> q2;
};