实现一
思路
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;
}
#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;
}