C++模板实现队列

我准备练习一下模板的知识,然后自己实现vector类。在这之前,先用模板实现一个队列来热身吧。队列的底层是链表。主要是熟悉一下模板的写法。

另外,就是模板的定义和实现都要写在一个文件中(export关键字可以避免这样。还没用过),所以倒数第二行我加了个# include "queue.hpp",只能是hpp,不能是cpp。不然报错。我用的是4.5.2。

1.queue.h

/*
 * queue.h
 *
 *  Created on: 2011-8-28
 *      Author: gauss
 */

#ifndef QUEUE_H_
#define QUEUE_H_

template<typename T> class queue;

template<typename T>
class queue_item {
	friend class queue<T> ; //注意此处友元类的声明形式
	queue_item(const T& i) :
		item(i), next(0) {
	}
	T item;
	queue_item *next;
};

template<typename T>
class queue {
public:
	queue() :
		head(0), tail(0), n(0) {
	}
	queue(const queue &q);
	queue& operator=(const queue &q);
	~queue();
	void push(const T &i);
	void pop();
	T front();
	T back();
	bool empty() {
		if (n > 0)
			return false;
		else
			return true;
	}
	size_t size() {
		return n;
	}
	void clear();

private:
	queue_item<T> *head;
	queue_item<T> *tail;
	size_t n;
	void copy_item(const queue &q);
};
#include "queue.hpp"               //注意这句话。
#endif /* QUEUE_H_ */

2.queue.hpp

/*
 * queue.hpp
 *
 *  Created on: 2011-8-28
 *      Author: gauss
 */

#ifndef QUEUE_HPP_
#define QUEUE_HPP_

template<typename T>
void queue<T>::push(const T &i) //注意类作用域的形式:queue<T>::
{
	queue_item<T> *item = new queue_item<T> (i);

	if (n == 0) {
		head = tail = item;
	} else {
		tail->next = item;
		tail = item;
	}
	++n;
}

template<typename T>
void queue<T>::pop() {
	if (n > 0) {
		queue_item<T> *temp = head;
		head = head->next;
		delete temp;
		--n;
	}
}

template<typename T>
T queue<T>::front() {                       //这里的返回显然可以是T&
	if (n > 0) {
		return head->item;
	} else {                            //这里处理的不太好,返回了一个默认初始化的T,实现不知道返回什么好
		T t;
		return t;
	}
}

template<typename T>
T queue<T>::back() {                  //这里的返回显然可以是T&
	if (n > 0) {
		return tail->item;
	} else {                      //这里我处理的不太好,反回了一个默认初始化的T,实现不知道返回什么好
		T t;
		return t;
	}
}

template<typename T>
void queue<T>::clear() {
	while (n > 0) {
		pop();
	}
}

template<typename T>
queue<T>::~queue() {
	clear();
}

template<typename T>
queue<T>::queue(const queue &q) :
	head(0), tail(0), n(0) {
	copy_item(q);
}

template<typename T>
queue<T>& queue<T>::operator=(const queue &q)
//注意此处,函数返回类型需此种形式queue<T>&, 不能是queue&
{
	if (this != &q) {
		clear();
		n = 0;
		copy_item(q);
	}
	return *this;
}

template<typename T>
void queue<T>::copy_item(const queue &q) {
	queue_item<T> *temp = q.head;
	while (temp) {
		push(temp->item);
		temp = temp->next;
	}
}
#endif /* QUEUE_HPP_ */

3.main.cpp

#include <cstdlib>
#include <iostream>
#include "queue.h"
#include <string>

using namespace std;

// test the queue class template
int main(int argc, char *argv[]) {
	queue<int> q;
	if (q.empty())
		cout << "empty" << endl;
	else
		cout << "not empty" << endl;
	q.push(1);
	q.push(2);
	queue<int> q2(q);
	q.clear();
	if (q.empty())
		cout << "empty" << endl;
	else
		cout << "not empty" << endl;
	cout << "queue 2: " << q2.front() << endl;
	cout << "queue 2: " << q2.back() << endl;
	cout << "the size of queue 2: " << q2.size() << endl;
	q = q2;
	cout << "queue 1: " << q.front() << endl;
	cout << "queue 1: " << q.back() << endl;

	queue<string> qs;
	qs.push("gauss");
	qs.push("randy");
	qs.push("jiawenjie");
	cout << qs.front() << endl;
	cout << qs.back() << endl;
	return EXIT_SUCCESS;
}


运行结果:

empty
empty
queue 2: 1
queue 2: 2
the size of queue 2: 2
queue 1: 1
queue 1: 2
gauss
jiawenjie


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值