您的位置:首页 > 编程语言 > C语言/C++

C++模板实现队列

2011-08-28 20:02 465 查看
我准备练习一下模板的知识,然后自己实现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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ class vector include