两个栈模拟队列,两个队列模拟栈

//栈 -> 后进先出

//队列 -> 先进先出


//1.两个栈 模拟实现一个队列


template<class T>
class MyQueue
{
public:


void Push(T t)  //插入不用判断,直接插入s1
{
s1.push(t);
}


T& Front()        //取队头数据
{
if (s2.size() != 0)  //如果s2 有数据,直接取
{
return s2.top();
}
else                 //s2没有数据,则把s1的数据全部插入s2(数据逆序),再取
{
while (!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
return s2.top();
}
}
void Pop()
{
if (s2.size() != 0)
{
s2.pop();
}
else
{
while (!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
s2.pop();
}
}


protected:
stack<T> s1;
stack<T> s2;
};


//2.两个队列模拟一个栈
template<class T>
class MyStack
{
public:
void Push(T t)     //数据直接插入q1
{
q1.push(t);
}


T Top()             //取栈顶数据 
{
assert(q1.empty() || q2.empty());


if (q1.size() == 1)
{
return q1.front();
}
if (q2.size() == 1)
{
return q2.front();
}


T tmp;
if (!q1.empty() && q2.empty())     //q2 为空,则把q1的数据插入到q2,吧q1最后一个数据返回
{
while (!q1.empty())
{
q2.push(q1.front());
q1.pop();
if (q1.size() == 1)
{
tmp = q1.front();
}
}
}
return tmp;


if (q1.empty() && !q2.empty())//q1 为空,则把q2的数据插入到q1,吧q2最后一个数据返回
{
while (!q2.empty())
{
q1.push(q2.front());
q2.pop();
if (q2.size() == 1)
{
tmp = q2.front();
}
}
}
return tmp;
}




void Pop()
{
if (!q1.empty() && q2.empty())     //q2 为空,则把q1的数据插入到q2,吧q1最后一个数据返回
{
while (!q1.empty())
{
q2.push(q1.front());
q1.pop();
if (q1.size() == 1)
{
q1.pop();
}
}
}
if (q1.empty() && !q2.empty())//q1 为空,则把q2的数据插入到q1,吧q2最后一个数据出栈
{
while (!q2.empty())
{
q1.push(q2.front());
q2.pop();
if (q2.size() == 1)
{
q2.pop();
}
}
}
}


protected:
queue<T> q1;
queue<T> q2;
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值