STL 队列模板实现

C++ Prime确实有点难啊!看了好久都没弄清楚,一点点慢慢来。

#include <iostream>
#include <string>
#include <cstdio>

template <class Type> class Queue;

//function template declaration must precede friend declaration in QueueItem
template <class T>
std::ostream& operator<<(std::ostream&,const Queue<T>&);

template <class Type> class QueueItem{
     friend class Queue<Type>;
	 // needs access to item and next
	 friend std::ostream&
		 operator<< <Type> (std::ostream&,const Queue<Type>&);
	 // private class: no public section
	 QueueItem(const Type &t):item(t),next(0){}
	 Type item;                   // value stored in this element
	 QueueItem *next;             // pointer to next element in the Queue
};

template <class Type> class Queue{
	// needs access to head
	friend std::ostream&
	operator << <Type> (std::ostream&,const Queue<Type>&);
public:
	// empty Queue
	Queue():head(0),tail(0){}
	// construct a Queue from a  pair of iterators on some sequence
	template <class It>
	Queue(It beg,It end):
	    head(0),tail(0){ copy_elems(beg,end); }
	// copy control to manage pointers to QueueItems in the Queue
	Queue(const Queue &Q)
		:head(0),tail(0){ copy_elems(Q); }
	Queue& operator=(const Queue&);            // left as exercise for the reader
	~Queue() { destroy(); }
	// replace current Queue by contents delimited by a pair of iterators
	template <class Iter> void assign(Iter,Iter);
	// return element from head of Queue
	// unchecked operation:front on an empty Queue is undefined
	Type& front() {return head->item; }
	const Type &front() const {return head->item;}
	void push(const Type &);
	void pop();
	bool empty()const{           //true if no elements in the Queue
	    return head == 0;
	}
private:
	QueueItem<Type> *head;
	QueueItem<Type> *tail;
	void destroy();
	void copy_elems(const Queue&);
	// version of copyto be used by assign to copy elements from iterator range
	template <class Iter> void copy_elems(Iter,Iter);
};

// push 函数
// push 成员将新项放在队列末尾

template <class Type> void Queue<Type>::push(const Type &val)
{
	// allocate a new QueueItem object
	QueueItem<Type> *pt = new QueueItem<Type>(val);
	// put item onto existing(目前) queue
	if(empty())
		head = tail = pt;    // the queue now has only one element
	else {
		tail->next = pt;     // add new element to end of the queue
		tail = pt;
	}
}

//copy_element 函数
template <class Type>
void Queue<Type>::copy_elems(const Queue &orig)
{
	// copy elements from orig into this Queue
	// loop stops when to pt == 0, which happens when we reach orig.tail
	for (QueueItem<Type> *pt = orig.head; pt; pt = pt->next)
		push(pt->item);              // copy element
}

// destroy 函数
template <class Type> void Queue<Type>::destroy()
{
	while (!empty())
		pop();
}

//pop函数
template <class Type> void Queue<Type>::pop()
{
	// pop is unchecked: Popping off an empty Queue is undefined
	QueueItem<Type>* p = head;
	head = head->next;
	delete p;
}

int main()
{
	int n,val;
	Queue<int> IntQ;
	/*Queue<double> DouQ;
	Queue<string> StrQ;*/
	printf("Please enter you want total number: ");
	std::cin>>n;
	while(n){
	     std::cin>>val;
		 IntQ.push(val);
		 n--;
	}
	while(!IntQ.empty()){
		std::cout<<IntQ.front()<<std::endl;
		IntQ.pop();
	}
	return 0;
}

STL 队列模板实现,布布扣,bubuko.com

时间: 2024-10-13 12:16:56

STL 队列模板实现的相关文章

C++ 标准模板库STL 队列 queue 使用方法与应用介绍

C++ 标准模板库STL 队列 queue 使用方法与应用介绍 queue queue模板类的定义在<queue>头文件中. 与stack模板类很相似,queue模板类也需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque类型. 定义queue对象的示例代码如下: queue<int> q1; queue<double> q2; queue的基本操作有: 入队,如例:q.push(x); 将x接到队列的末端. 出队,如例:

STL 队列 、优先队列、栈 小结

学长说现在基本上可以开始学习STL中一些标准模板了,今天先总结一下 队列.栈.优先队列 1.队列(queue) 先进先出原则,头文件#include <queue>,定义结构queue<类型>名称;queue<int>q.queue<node>q等: 如: struct node { int x; }f; queue<node>q;//结构体类型队列 q.push(f) //将f压入队列的尾部 node t = q.pop()// 弹出队列的第一

【C++】STL队列和栈的使用

C++的STL标准模板库提供了队列和栈的基本操作.下面通过两个demo分别介绍STL队列和STL栈的使用. Demo1:STL队列 [题目]卡片游戏(题目来自刘汝佳<算法竞赛入门>) 桌上又一叠牌,从第一张牌(即位于顶面的牌)开始从上往下依次编号为1~n.当至少还剩两张牌时进行以下操作:把第一张牌扔掉,然后把新的第一张放到整叠牌的最后.输入n,输出每次扔掉的牌,以及最后剩下的牌. 样例输入:7 样例输出:1 3 5 7 4 2 6 [分析]这些牌就是一个先进先出(FIFO)的队列,每次对排头的

STL队列、优先队列、栈

STL 中优先队列的使用方法(priority_queu) 基本操作: empty() 如果队列为空返回真 pop() 删除对顶元素 push() 加入一个元素 size() 返回优先队列中拥有的元素个数 top() 返回优先队列对顶元素 在默认的优先队列中,优先级高的先出队.在默认的int型中先出队的为较大的数. 使用方法: 头文件: #include <queue> 声明方式: 1.普通方法: priority_queue<int>q;//通过操作,按照元素从大到小的顺序出队

c++ STL:队列queue、优先队列priority queue 的使用

说明:本文全文转载而来,原文链接:http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177644.html C++ Queues(队列) C++队列是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构.1.back() 返回一个引用,指向最后一个元素2.empty() 如果队列空则返回真3.front() 返回第一个元素4.pop() 删除第一个元素5.push() 在末尾加入一个元素6.size() 返回队列中元素的个数

Sliding Window POJ - 2823 单调队列模板题

Sliding Window POJ - 2823 单调队列模板题 题意 给出一个数列 并且给出一个数m 问每个连续的m中的最小\最大值是多少,并输出 思路 使用单调队列来写,拿最小值来举例 要求区间最小值 就是维护一个单调递增的序列 对于样例 8 3 1 3 -1 -3 5 3 6 7 我们先模拟一遍 1.队列为空 1 进队 队列:1 2.3>队尾元素 3 进队 队列: 1 3 3.-1小于队尾元素,一直从尾部出队知道找到比-1小的元素或者队列为空 队列:-1 当队列中元素大于m的时候从队头删

C++STL——队列

一.相关定义 原理:queue 队列也是一个线性存储表,元素数据的插入在表的一端进行,在另一端删除,从而构成了一个先进先出FIFO(First In First Out)表. 队头&队尾:插入一端称为队尾,删除一端称为队首. C++队列是一种容器适配器,默认使用双端队列deque来实现,将 deque 容器转换为 queue 容器.当然,也可以利用其他合适的序列容器作为底层实现queue容器. 队列可以用线性表(list)或双向队列(deque)来实现(注意vector container不能用

C++ 学习笔记之 STL 队列

一.  引言 在算法以及数据结构的实现中,很多地方我们都需要队列(遵循FIFO,先进先出原则). 为了使用队列,我们可以自己用数组来实现队列,但自己写太麻烦不说,并且还很容易出错. 好在C++的STL(标准模板库)为我们实现了一个强大的队列,它包含在头文件<queue>中. 二.    queue a)     构造函数 下面用例子来展示queue的构造函数 deque<int> deck(3,100); list<int> mylist(2,100); queue&l

STL 标准模板库

STL(Standard Template Library,标准模板库), 组成: STL可分为容器(containers).迭代器(iterators).空间配置器(allocator).配接器(adapters).算法(algorithms).仿函数(functors)六个部分. 容器部分主要由头文件<vector>,<list>,<deque>,<set>,<map>,<stack>和<queue>组成.对于常用的一