BUPT-DSA 2019 Fall Chap.3 雙棧隊列

實際上是想用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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章