实际上是想用FIFO实现FILO,内部的两个栈一样大可以避免S1把S2倒满了还有多的情况。
思路:装东西装进S1,出东西把S1先倒入S2,从S2出,如果之前S2有元素,就先出S2原有的。
使用了模板类来实现,可以使用Queue_s<类型>来实现任意数据类型的双栈队列,比如声明一个装char的队列。
Queue_s<char> s;
测试程序是输入一些数,EOF结束,然后按原来的顺序打印出来。
#include <stack>
#include <cstdio>
using namespace std;
template <typename T>
class Queue_s
{
//基本思路:加元素往S1先装,出元素把S1的全倒到S2里,然后从S2出去,只要保证出来元素的顺序和队列的规律一样就行
public:
bool Enqueue(T item);
T Dequeue();
bool Fullq();
bool Emptyq();
private:
stack<T> S1;
stack<T> S2;
};
template <typename T>
bool Queue_s<T>::Enqueue(T item)
{
if(this->Fullq()) return false;//如果队列满了,那就不装了
S1.push(item);//S1还用空,就装进S1
return true;
}
template <typename T>
T Queue_s<T>::Dequeue()
//应该做边界处理,此处不做,默认程序员调用前检查过Emptyq()
//stl使用不同的方法front()和pop()来访问、删除元素,和但作业要求用Dequeue直接返回
{
T result;
//不能每次都拷贝S1到S2,先进入S2的肯定是队列头,不然顺序不对
//S2是空的,才用S1把S2倒满
if(S2.empty())
while(!S1.empty()){
S2.push(S1.top());
S1.pop();
}
result=S2.top();
S2.pop();
return result;
}
template <typename T>
bool Queue_s<T>::Fullq()
{
return false;//无意义,不会满
//如果不是无限容量,就检测是不是S1满了
}
template <typename T>
bool Queue_s<T>::Emptyq()
{
return S1.empty()&&S2.empty();//都空了才是真的空
}
int main(int argc, char const *argv[])
{
int num;
Queue_s<int> q;
while(scanf("%d",&num)!=EOF)
q.Enqueue(num);
while(!q.Emptyq())
printf("%d ",q.Dequeue() );
putchar('\n');
return 0;
}