【华为练习题】用两个栈来模拟队列(中级)
题目
栈的特点是后进先出,队列的特点是先进先出。所以,用两个栈S1和S2模拟一个队列时,
要求两个栈S1和S2的长度都是5。
要求实现以下函数:
enQueue 将元素value插入队列,若入队列成功返回true,否则返回false
deQueue 从队列中取出一个元素放入value,若出队列成功返回true,否则返回false。
isEmptyQueue 判用队列是否为空,如果是空则返回true,如果不是空则返回false。
分析
S1作输入栈,逐个元素压栈,以此模拟队列元素的入队。当需要出队时,将栈S1退栈并逐
个压入栈S2中,S1中最先入栈的元素,在S2中处于栈顶。S2退栈,相当于队列的出队,实
现了先进先出。
解答
#include <iostream>
#include <stack>
using namespace std;
const static size_t STACK_SIZE = 5;
template <typename T> class MyQueue
{
public:
bool enQueue(const T&);
bool deQueue(T&);
bool isEmptyQueue();
private:
stack<T> s1;
stack<T> s2;
};
template <typename T> bool MyQueue<T>::enQueue(const T &value){
if (s1.size() < STACK_SIZE)
{
s1.push(value);
return true;
}
if (s2.empty())
{
while (!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
s1.push(value);
return true;
}
return false;
}
template <typename T> bool MyQueue<T>::deQueue(T &value){
if (!s2.empty())
{
value = s2.top();
s2.pop();
return true;
}
if (!s1.empty())
{
while (!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
value = s2.top();
s2.pop();
return true;
}
return false;
}
template <typename T> bool MyQueue<T>::isEmptyQueue(){
return s1.empty() && s2.empty();
}
时间: 2024-11-01 09:22:13