您的位置:首页 > 职场人生

【面试题】剑指Offer-7-两个栈实现一个队列

2017-03-14 13:05 513 查看

题目概述

用两个栈实现一个队列

解题思路

栈的特点是后进先出,而队列是先进先出;为了用两个栈实现一个队列,我们还是需要两个栈来实现

其中一个栈为sin,主要操纵入队;另一个栈为sout,主要用来从此出队

图解



代码实现

//两个栈实现一个队列
template<typename T>
class QueueBTS
{
public:
void Push(const T& x)
{
sin.push(x);
}
void Pop()
{
assert(!sin.empty() || !sout.empty());
if (sout.empty())
{
while (!sin.empty())
{
sout.push(sin.top());
sin.pop();
}
}
sout.pop();
}

const T& Front()
{
assert(!sin.empty() || !sout.empty());
if (sout.empty())
{
while (!sin.empty())
{
sout.push(sin.top());
sin.pop();
}
}
return sout.top();
}
protected:
stack<T> sin;//入列的栈
stack<T> sout;//出列的栈
};

题目扩展

两个队列实现一个栈

解题思路

这里我们也是,定义两个队列,第一个队列qin主要负责元素的入栈;第二个队列qout负责出栈

图解



代码实现

//两个队列实现一个栈
template<typename T>
class StackBTQ
{
public:
void Push(const T& x)
{
//入栈的元素直接push到qin里面
qin.push(x);
}

void Pop()
{
assert(!qin.empty() || !qout.empty());
//qin队列为空
if (qin.empty())
{
while (qout.size() > 1)
{
qin.push(qout.front());
qout.pop();
}
qout.pop();
}
else//qin队列不为空
{
while (qin.size() > 1)
{
qout.push(qin.front());
qin.pop();
}
qin.pop();
}
}

T Top()
{
assert(!qin.empty() || !qout.empty());
//qin队列为空
if (qin.empty())
{
while (qout.size() > 1)
{
qin.push(qout.front());
qout.pop();
}
return qout.front();
}
else//qin队列不为空
{
while (qin.size() > 1)
{
qout.push(qin.front());
qin.pop();
}
return qin.front();
}
}
protected:
queue<T> qin;
queue<T> qout;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  剑指Offer