實際上是想用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;
}