两个栈实现队列

实现一

思路

    s1是入栈的,s2是出栈的。

  • 入队列,直接压到s1是就行了
  • 出队列,先把s1中的元素全部出栈压入到s2中,弹出s2中的栈顶元素;再把s2的所有元素全部压回s1中

实现二

思路

    s1是入栈的,s2是出栈的。保证所有元素都在一个栈里面

  • 入队列时:如果s1为空,把s2中所有的元素倒出压到s1中;否则直接压入s1
  • 出队列时:如果s2不为空,把s2中的栈顶元素直接弹出;否则,把s1的所有元素全部弹出压入s2中,再弹出s2的栈顶元素

实现三

思路

    s1是入栈的,s2是出栈的。

  • 入队列:直接压入s1即可
  • 出队列:如果s2不为空,把s2中的栈顶元素直接弹出;否则,把s1的所有元素全部弹出压入s2中,再弹出s2的栈顶元素
#define _CRT_SECURE_NO_WARNINGS 1


#include<stdlib.h>
#include<iostream>
#include<stack>
#include<assert.h>
using namespace std;


template<class T>
class Queue
{
public:
void Push(const T& d)
{
sPush.push(d);
}
void Pop()
{
if (sPop.empty()) //若第二个栈为空  
{
ExChange(sPush, sPop);//将第一个栈中元素导入到第二个栈中  
}
sPop.pop();//栈顶元素弹出  


}
T& Front()
{
if (sPop.empty())
{
ExChange(sPush, sPop);
}
return sPop.top();
}
T& Back()
{
if (sPush.empty())
{
ExChange(sPop, sPush);
}
return sPush.top();
}


public:
//这里是将所有元素都导入第二个栈中后在弹出第二个栈的栈顶元素  
void ExChange(stack<T>& sPush, stack<T>& sPop)//将第一个栈中元素导入到第二个栈中  
{
while (!sPush.empty())//若第一个栈不为空  
{
sPop.push(sPush.top());//第一个栈中元素依次导入第二个栈中  
sPush.pop();//弹出该元素  
}
}
bool Empty()
{
return (Size() == 0);
}
size_t Size()
{
return (sPush.size() + sPop.size());
}
protected:
stack<T> sPush;
stack<T> sPop;
};
void Test()
{
Queue<int> q;
q.Push(1);
q.Push(2);
q.Push(3);
q.Push(4);
q.Push(5);
cout << q.Size() << endl;
while (!q.Empty())
{
cout << q.Front() << " ";
q.Pop();
}
}
int main()
{
Test();
system("pause");
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值