1、 inline void makeEmpty(); /清空队列 inline void enqueue( const Type &x ); /插入一个元素 inline void dequeue( Type & /弹出一个元素inline void getFront( Type &x); /得到对头元素private:LinkNodenext-data 是队头的第一个元素 *rear; /指向队尾(最后添加的一个元素)的指针inline void handleUnderflow(); /控制队列下溢二、 题目设计思路1.queue.h文件在queue.h头文件中使用命名空间itlab在其中声明
2、:(1)模板结构体链表结点(struct LinkNode),其中包含的数据成员有:模板参数类类型Type 对应的data,存放模板实现类的具体数据,LinkNode 模板类型结构体指针 next,用来指向下一个结点;成员函数包括:LinkNode()无参构造函数,其中数据成员next默认为NULL,LinkNode(const Type & *p = NULL),采用参数初始化表对数据成员初始化,其中第一个参数为常量Type类型的引用x,初始化数据成员data,第二个参赛为结构体类型指针p默认值为NULL,用来初始化数据成员next。(2)模板类队列(class Queue),包含的公共成员
3、函数有:无参构造函数 Queue(),在定义对象时,由系统调用,完成对象的初始化;析构函数Queue(),与构造函数相反,是在撤销对象占用内存前进行一些清理工作。可以被用来执行“用户希望在最后一次使用对象之后所执行的任何操作”;内联函数判断队列是否为空,返回值为布尔类型常量,inline bool isEmpty() const;内联函数清空队列,无返回值,inline void makeEmpty();内联函数向队列中插入一个元素,inline void enqueue(const Type &x),参数为Type类型常量,插入的新元素作为队列中的队尾结点;内联函数从队列中弹出一个元素, i
4、nline void dequeue( Type &x ),无返回值,但传入参数为Type类型的引用x,从对首取出结点元素的数据,将其赋值给x,实现函数值的返回;内联函数得到对首元素结点的数据,inline void getFront( Type &x),同样采用函数参数引用类型间接返回函数值;私有数据成员包括:指向模板结构体类型变量的头指针,LinkNode *front指向模板结构体类型变量的后继指针,LinkNode *rear内联函数控制队列下溢,inline void handleUnderflow()。(3)同时包含其实现文件queue-impl.h,#include queue-
5、impl.h 。 2.queue-impl.h文件在queue-impl.h头文件,是实现queue.h头文件中声明的模板类Queue,实现其声明的函数,完成函数的定义,在预编译时,会将头文件queue-impl.h中的内容取代头文件queue.h中的 #include 这一行。3.queue_test.cpp在queue_test.cpp文件中,包含主函数,声明结构体类型Student,是模板结构体链表(LinkNode)的实现类,将其作为插入队列和弹出队列的基本元素,测试队列类Queue的主要成员函数:判断队列是否为空(isEmpty)、向对列中插入一个元素(enqueue)、从队列中弹出
6、一个元素(dequeue)、得到队首元素的数据(getFront)、私有成员函数控制队列下溢(handleUnderflow)。三、 类设计与类关系1.类设计主要包含队列类Queue。其私有数据成元是指向结构体类型变量(struct Student)的头指针和指向结构体类型的后继指针。在main函数中声明了结构体类型Student,其主要包含整型的学号、字符串类型的学生姓名、字符串类型的系部名称,以及带默认参数的构造函数。2.类关系在main函数中,通过定义一个队列类类型的对象q(Queue q),显示的将结构体类型(Student为结构体类型)传递给 Queue对应的类参Type(模板参数类
7、型)。四、 主要功能函数流程图1.向对列中插入一个元素函数( inline void enqueue(const Type &x) )流程图2.从队列中弹出一个元素函数( inline void dequeue( Type &x ) )流程图五、 运行结果及分析1.运行结果:2.结果分析:(1)队列初始为空,依次将学生插入队列,并打印入队顺序;(2)此时调用getFront(Type &x)函数取得对头的元素;(3)出对时,按照先进先出原则,打印出队顺序。六、 总结1.模板机制(1)模板的代码重用机制是基于C语言宏展开基础发展而来,宏展开的一套文本替换算法从预处理阶段搬移到编译阶段,结合函数重
8、载中的一套类型匹配搜寻算法一起就诞生了模版的内在运作机制。(2)函数模板和类模板提供了类型参数化的通用机制。函数模板的类参在函数的调用点根据实参的类型反演出来,形成重载函数,同时实参的数值作为入口又进行函数调用。(3)类模板的类参一般由对象定义的方式显式给出,根据直接指定的类名或整型常数初始化模板类参形参表中的对应项目值,用这些具体的类名和常数替换模板中类参或形参,形成特定的类。这些工作是编译器自动宏替换复制完成的,但比预处理的宏替换执行了更多的类型安全检查,而根据模板生成的代码具有明显的相近性质。(4)需要注意形参与类参的区别,形参是运行时压入堆栈传递给函数的数据值,而类参是在函数调用点获得
9、的实参的静态数据类型,数据类型是静态的,该数据类型在编译阶段确定。(5)函数模板产生的函数是一系列形参个数相同,形参数据类型不同的重载函数,类模板产生的类是类名不同,结构相近的类。(6)此外,类模板的不同实现是不同的类,此特定的类上的模板成员函数不同于彼模板类相应的成员函数版本。其间通过类域分辨符进行了清晰的分界,因此类模板提供一种类型安全的鉴别机制。2.队列数据结构(1)队列是一种采用先进先出(first in,first out FIFO)策略的对元素操作的动态集合。(2)队列上的INSERT操作称为入队(ENQUEUE),DELETE操作称为出队(DEQUEUE)。(3)队列的先进先出特
10、性类似于收银台前排队等待结账的一排顾客。队列有对头(head)和对尾(tail),当有一个元素入对时,它被放在队尾的位置,就像一个新到来的顾客排在队伍末端一样。而出队的元素则总是在对头的那个,就像排在队伍前面等待最久的那个顾客一样。源代码:/* * queue.h * * A simple queue implemented by C+ template class. */#ifndef QUEUE_H#define QUEUE_H#include #includecstdlibusing namespace std;namespace itlab /* * Queue Node */ /#d
11、efine QUEUE_INIT_SIZE 100 /队列初始化大小 /#define QUEUE_INCREMENT 10 /队列空间不够时一次申请大小 template struct LinkNode Type data; ; * Queue class Queue Queue (); / Queue(const Queue &q); / Queue & operator=(const Queue inline void handleUnderflow(); #include /namespace itlab#endif/ QUEUE_H/-/- * queue-impl.h * Impl
12、ementation for Queue class./* * constructors and destructor Queue:Queue():front(NULL), rear(NULL) Queue() makeEmpty(); * If the queue empty, return true. inline bool QueueisEmpty() const return front = NULL; * Make the queue empty. inline void Queuenext; delete p; * Enter the element into the queue.
13、enqueue( const Type &x ) if(front = NULL) front = rear = new LinkNode( x ); if( !front ) cerr Out of memory! next = new LinkNode * Pop an element from the queue.dequeue( Type &isEmpty() ) *p = front; x = front-data; handleUnderflow(); * Get the front element of the queue.getFront( Type & * Handle th
14、e error of get element from am empty queue.handleUnderflow()The queue is empty! endl #include queue.husing namespace itlab;struct Student int stuNum; string stuName; string department; Student ( int number = 0, const string &name = Tom&Jerry, const string &dpt = Information ) : stuNum(number), stuNa
15、me(name), department(dpt)int main(int argc, char* argv) Student stu; q; Student students 3 = Student(11, ZhangMing, ), Student(12, HuZhaoJun Student(13, ZhangYuYangAutoControl) ; cout 入队列顺序为: for(int i=0; i3; i+) cout studentsi.stuNum t studentsi.stuName studentsi.department q.enqueue( studentsi );对首元素为: q.getFront( stu ); stu.stuNum stu.stuName stu.department 出队列顺序为: while( !q.isEmpty() ) q.dequeue( stu ); return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1