题目

编写程序queue.h,用链表实现队列(或栈)类。在测试程序lab9_2.cpp中定义一个整型队列(或栈)对象,插入5个整数,压入队列(或栈),再依次取出并显示出来。

C++代码如下:

//node.h

#ifndef NODE_H//结点类模板
#define NODE_H
template<class T>
class linkedlist;//新添
template<class T>//新添
class node
{private:node<T>* next;//指向后继指针的结点
public:T data;//数据域node(const T& data, node<T>* next = 0);//构造函数void insertAfter(node<T>* p);//在本结点之后插入一个同类的结点Pnode<T>* deleteAfter();//删除本结点的后继结点,并返回其地址node<T>* nextNode();//获取后继结点的地址const node<T>* nextNode()const;//获取后继结点的地址friend linkedlist<T>;//因操作需要将linkedlist<T>作为node的友元(新添)
};
template<class T>
node<T>::node(const T& data, node<T>* next/*=0*/) :data(data), next(next)
{}
template<class T>
node<T>* node<T>::nextNode()
{return next;
}
template<class T>
const node<T>* node<T>::nextNode()const
{return next;
}
template<class T>
void node<T>::insertAfter(node<T>* p)
{p->next = next;next = p;
}
template<class T>
node<T>* node<T>::deleteAfter()
{node<T>* tempPtr = next;if (next == 0)return 0;next = tempPtr->next;return tempPtr;
}
#endif

//link.h

#ifndef LINKEDLIST_H
#define LINKEDLIST_H
#include<iostream>
using namespace std;
#include "node.h"
template<class T>
class linkedlist
{private:node<T>* front, * rear;//表头和表尾指针node<T>* prevPtr, * currPtr;//记录表当前遍历位置的指针,由插入和删除操作更新int size;//表中的元素个数int position;//当前元素在表中的位置序号,由函数reset使用//函数成员://生成新结点,数据域为item,指针域为ptrNextnode<T>* nextNode(const T& item, node<T>* ptrNext = NULL);void freeNode(node<T>* p);//释放结点                                     (未用)//将链表L复制到当前表(假设当前表为空)//被复制构造函数和“operator=”调用void copy(linkedlist<T>& L);//(因实现需要,无法使用(linkedlist<T>const&L)作为形参表)
public:void print();//打印链表类里的数据及其数目(新添)linkedlist();linkedlist(linkedlist<T>& L);//复制构造函数(因实现需要,无法使用(linkedlist<T>const&L)作为形参表)~linkedlist();linkedlist<T>& operator=(linkedlist<T>& L);//重载赋值运算符(因实现需要,无法使用(linkedlist<T>const&L)作为形参表)int getSize()const;//返回链表中的元素个数bool isEmpty()const;//链表是否为空                                      (未用)void reset(int pos = 0);//初始化游标的位置(第一位数的位置设为0)void next();//使游标移动到下一个结点bool endOfList()const;//游标是否到了链尾int currentPosition(void);//返回游标当前的位置void insertFront(const T& item);//在表头插入结点void insertRear(const T& item);//在表尾添加结点void insertAt(const T& item);//在当前结点之前插入结点void insertAfter(const T& item);//在当前结点之后插入结点T deleteFront();//删除头结点void deleteCurrent();//删除当前结点T& data();//返回对当前结点成员数据的引用const T& data()const;//返回对当前结点成员数据的常引用//清空链表:释放所有结点的内存空间。被析构函数和“operator ="调用void clear();
};
template<class T>
node<T>* linkedlist<T>::nextNode(const T& item, node<T>* ptrNext)//生成新结点,数据域为item,指针域为ptrNext
{node<T>* tempPtr = new node<T>(item, ptrNext);return tempPtr;
}
template<class T>
void linkedlist<T>::freeNode(node<T>* p)//释放结点
{delete p;
}
template<class T>
void linkedlist<T>::print()//打印链表类里的数据及其数目(新添)
{reset();while (!endOfList()){cout << data() << " ";next();}cout << endl;cout << "size=" << getSize() << endl;
}
template<class T>
linkedlist<T>::linkedlist()//构造函数
{size = 0;front = rear = new node<T>(0);currPtr = prevPtr = front;
}
template<class T>
int linkedlist<T>::currentPosition(void)//返回游标当前的位置
{node<T>* tempPtr = front->nextNode();position = 0;while (tempPtr != currPtr){tempPtr = tempPtr->nextNode();position++;}return position;
}template<class T>
int linkedlist<T>::getSize()const//返回链表中的元素个数
{return size;
}template<class T>
T& linkedlist<T>::data()//返回对当前结点成员数据的引用
{return currPtr->data;
}
template<class T>
const T& linkedlist<T>::data()const//返回对当前结点成员数据的常引用
{return currPtr->data;
}
template<class T>
void linkedlist<T>::next()//使游标移动到下一个结点
{prevPtr = currPtr;currPtr = currPtr->nextNode();
}
template<class T>
bool linkedlist<T>::endOfList()const//游标是否到了链尾
{if (currPtr == NULL)return true;else return false;
}
template<class T>
bool linkedlist<T>::isEmpty()const//链表是否为空
{if (front == rear)return true;else return false;
}
template<class T>
void linkedlist<T>::reset(int pos)//初始化游标的位置(第一位数的位置设为0)
{prevPtr = front;currPtr = front->nextNode();position = pos;for (int i = 0; i < position; i++){prevPtr = currPtr;currPtr = currPtr->nextNode();}
}
template<class T>
void linkedlist<T>::insertFront(const T& item)//在表头插入结点
{prevPtr = currPtr;currPtr = nextNode(item, front->nextNode());front->next = currPtr;if (rear == front){rear = currPtr;}size++;
}
template<class T>
void linkedlist<T>::insertRear(const T& item)//在表尾添加结点
{prevPtr = currPtr;currPtr = nextNode(item, rear->nextNode());rear->next = currPtr;rear = currPtr;size++;
}
template<class T>
void linkedlist<T>::insertAfter(const T& item)//在当前结点之后插入结点
{prevPtr = currPtr;node<T>* tempPtr = nextNode(item, currPtr->nextNode());currPtr->next = tempPtr;if (currPtr == rear){rear = tempPtr;}currPtr = tempPtr;size++;}
template<class T>
void linkedlist<T>::insertAt(const T& item)//在当前结点之前插入结点
{currPtr = nextNode(item, prevPtr->nextNode());prevPtr->next = currPtr;size++;
}
template<class T>
T linkedlist<T>::deleteFront()//删除头结点
{currPtr = front->nextNode();delete front;front = currPtr;size--;return front->data;
}
template<class T>
void linkedlist<T>::deleteCurrent()//删除当前结点
{node<T>* tempPtr = currPtr;prevPtr->deleteAfter();delete currPtr;currPtr = prevPtr;size--;
}
template<class T>
void linkedlist<T>::clear()//清空链表:释放所有结点的内存空间。被析构函数和“operator ="调用
{node<T>* tempPtr = front->nextNode();while (tempPtr != NULL){node<T>* tempQ = tempPtr;tempPtr = tempPtr->nextNode();delete tempQ;size--;}rear = front;currPtr = prevPtr = front;
}
template<class T>
linkedlist<T>::~linkedlist()//析构函数
{clear();delete front;
}
template<class T>
void linkedlist<T>::copy(linkedlist<T>& L)//将链表L复制到当前表(假设当前表为空)被复制构造函数和“operator=”调用
//(因实现需要,无法使用(linkedlist<T>const&L)作为形参表)
{//clear();L.reset();for (int i = 0; i < L.size; i++){insertRear(L.data());L.next();}}
template<class T>
linkedlist<T>& linkedlist<T>::operator =(linkedlist<T>& L)//重载赋值运算符(因实现需要,无法使用(linkedlist<T>const&L)作为形参表)
{clear();front->next = NULL;copy(L);cout << "调用重载运算符=" << endl;return *this;
}
template<class T>
linkedlist<T>::linkedlist(linkedlist<T>& L)//复制构造函数(因实现需要,无法使用(linkedlist<T>const&L)作为形参表)
{size = 0;front = rear = new node<T>(0);currPtr = prevPtr = front;copy(L);cout << "调用复制构造函数" << endl;
}
#endif

//queue.h

//queue.h
#ifndef QUEUE_CLASS
#define QUEUE_CLASS
#include <iostream>
#include <cstdlib>
using namespace std;
#include "link.h"
template <class T>
class Queue {
private: LinkedList<T> queueList;
public: Queue(void); void QInsert(const T& elt); T QDelete(void); T QFront(void); int QLength(void) const; int QEmpty(void) const; void QClear(void);
};
template <class T>
Queue<T>::Queue(void)
{}
template <class T>
int Queue<T>::QLength(void) const
{ return queueList.ListSize();
}
template <class T>
int Queue<T>::QEmpty(void) const
{ return queueList.ListEmpty();
}
template <class T>
void Queue<T>::QClear(void)
{ queueList.ClearList();
}
template <class T>
void Queue<T>::QInsert(const T & elt)
{ queueList.InsertRear(elt);
}
template <class T> T Queue<T>::QDelete(void)
{ if (queueList.ListEmpty()) { cerr << "Calling QDelete for an empty queue!" << endl;exit(1); } return queueList.DeleteFront();
}
template <class T> T Queue<T>::QFront(void)
{ if (queueList.ListEmpty()) { cerr << "Calling QFront for an empty queue!" << endl; exit(1); } queueList.Reset();return queueList.Data();
}
#endif // QUEUE_CLASS 

//lab9_2.cpp

//lab9_2.cpp
#include "queue.h"
int main()
{ Queue<int> A; for(int i=0;i<5;i++) { A.QInsert(i); } cout << " 队列 A 的元素为: "; while (!A.QEmpty()) { cout << A.QFront() << " ";A.QDelete(); } cout << endl;
}

实验8.2 队列类的定义与实现相关推荐

  1. java实验:银行账户类的定义与使用

    内容要求: 一.实验目的 (1)理解对象和类,掌握用类创建对象模型. (2)理解和掌握抽象类的使用 (3)理解和掌握继承.方法覆盖的使用 (4)初步掌握使用多态性的方法 二.实验内容 按照如下步骤完成 ...

  2. 实验8.1 链表类的定义与实现

    题目 参照教材中链表类LinkedList的定义(教材中的例程9-6.h),给出其实现,注意合理使用Node类(教材中的例程9-3.h)的成员函数.在测试程序中定义整型链表A和B,分别插入5个元素,使 ...

  3. SCAU 银行账户类的定义与使用

    随堂实验6 银行账户类的定义与使用 题目类别: C实验 关键字: 继承 覆盖 内容要求: 按照以下步骤的要求编写程序,实现银行账户类的定义. 步骤1:定义一个名为Account的抽象类代表一个银行账户 ...

  4. Java实验实现一个circle类,java实验报告-类的定义.doc

    java实验报告-类的定义 南京理工大学泰州科技学院 实验报告书 课程名称: <JAVA面向对象程序设计> 实验题目: 实验三 类的定义 班 级: 09计算机(2) 学 号: 090903 ...

  5. java数组使用实验报告_JAVA数组与类的定义-java实验报告

    JAVA数组与类的定义-java实验报告 JAVA数组与类的定义-java实验报告 .实验目的与要求 1. 熟悉Java类.对象和方法的一般操作练习等. 2. 熟悉数组等的定义和使用. 二.实验内容及 ...

  6. C++ 实验2:函数重载、函数模板、简单类的定义和实现

    1.函数重载编程 编写重载函数add(),实现对int型,double型,Complex型数据的加法.在main()函数中定义不同类型 数据,调用测试. #include <iostream&g ...

  7. java实验:正n多边形类的定义与使用

    一.实验目的 (1)理解对象和类,掌握用类创建对象模型. (2)理解和掌握数据域封装,可见性修饰符的使用 (3)学习如何定义类和创建对象,理解对象引用变量的概念. (4)理解构造方法的作用,并使用构造 ...

  8. 实验8.3 C++标准模板库(STL)中的双向队列类(deque)

    题目 使用C++标准模板库(STL)中的双向队列类(deque)重新实现上一小题. C++代码如下: #include <iostream> #include <deque> ...

  9. 数据结构与算法 第二次实验报告堆栈队列

          数据结构与算法 第二次实验报告 姓名:许恺 学号:2014011329 班级:计算机14-1 中国石油大学(北京)计算机科学与技术系 前     言 <数据结构>是计算机及相关 ...

最新文章

  1. java音频库_Java是否为音频_synthesis_内置了库?
  2. 人工智能免费公开课一网打尽!14个类别、230门课程,GitHub标星6000+
  3. 梦有感 2009-10
  4. Python 入门篇-用Notepad++编写出第一个python程序
  5. 文巾解题 994. 腐烂的橘子
  6. java 二维数组_Java中二维数组和异常的内容及应用
  7. scrapy 的三个入门应用场景
  8. JSTL之数字、日期格式化fmt:formatNumber/、fmt:formatDate/
  9. hashset去重原理_9道Java集合面试题,搞定了再去投简历吧!
  10. python能做什么-揭秘python都能做什么?
  11. AutoCad vba宏 用于线路设计方面简化工作量 明白的拿走
  12. 关于 iOS 的 StoryBoard,接受的那一刻才发现她的美 - 当然美的事物都需要业心照料
  13. 贴一篇感人肺腑激动人心的博客(转自51cto)
  14. IPA转APP的方法和APP转IPA的方法
  15. 【线段树】2019雅礼集训 sequence
  16. Magnifier笔记
  17. Eclipse学习1-Eclipse简介
  18. 自己写的C盘清理工具 Ver1.0.0
  19. 基于web的书籍销售共享平台
  20. 【莫烦Python】Numpy教程

热门文章

  1. Oracle物化视图的简单使用
  2. 如何从源码启动和编译IoTSharp
  3. 特征工程之归一化及标准化
  4. 相关插件在项目中使用参考
  5. 详谈Hibernate框架关系映射!
  6. tp中自定义跳转页面
  7. Asp.Net Mvc3.0(MEF依赖注入理论)
  8. 网络游戏外挂编写基础
  9. 【Spring 工厂】工厂设计模式、第一个Spring程序细节分析、整合日志框架
  10. 自底向上带你逆向解析hibernate联合主键