BUPT-DSA 2019 Fall Chap.3 双栈队列

本文介绍了一种使用双栈实现先进后出(FILO)到先进先出(FIFO)转换的方法。核心思路是在入队时将元素压入栈S1,出队时将S1的元素弹出并压入栈S2,再从S2出队,确保顺序正确。通过模板类设计,该实现可适用于多种数据类型。测试案例展示了如何输入一系列数字,以EOF结束,然后按照输入顺序输出。
摘要由CSDN通过智能技术生成

实际上是想用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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值