C++模板实现队列
2011-08-28 20:02
465 查看
我准备练习一下模板的知识,然后自己实现vector类。在这之前,先用模板实现一个队列来热身吧。队列的底层是链表。主要是熟悉一下模板的写法。
另外,就是模板的定义和实现都要写在一个文件中(export关键字可以避免这样。还没用过),所以倒数第二行我加了个# include "queue.hpp",只能是hpp,不能是cpp。不然报错。我用的是4.5.2。
1.queue.h
2.queue.hpp
3.main.cpp
运行结果:
empty
empty
queue 2: 1
queue 2: 2
the size of queue 2: 2
queue 1: 1
queue 1: 2
gauss
jiawenjie
另外,就是模板的定义和实现都要写在一个文件中(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++模板实现
- 队列(顺序存储)C++模板实现
- 队列(queue) 之 c++模板实现(友元函数和运算符重载)
- C++利用模板实现队列
- 优先级队列——用C++模板实现
- C++模板实现的队列多线程安全
- C++模板实现的单向队列
- 用两个栈实现队列(C++模板)
- C++模板实现链式队列
- 用两个队列实现栈(C++模板)
- 数据结构(6) 顺序队列 c++ 模板实现
- C++用模板实现双链表和队列
- 基于数组的循环队列(C++模板实现)
- 基于数组的循环队列(C++模板实现)
- C++ 模板应用 实现一个Queue 队列
- 队列(链式存储)C++模板实现
- 用C++队列模板实现杨辉三角的输出
- 数据结构(7) 链队列 c++ 模板实现
- C++模板链表实现优先级队列
- 队列详解与C++模板实现