顺序队列和链队列的实现(实验3.2)
来源:互联网 发布:白城广逸网络具体位置 编辑:程序博客网 时间:2024/06/04 19:54
一、实验目的
熟练掌握队列的结构特点,掌握队列的顺序存储和链式存储结构和实现。
二、实验内容
1.用C++的模板来实现顺序队列,下面是代码:
CirQueue.h
#ifndef CirQueue_h#define CirQueue_h#include <iostream>using namespace std;const int QueueSize = 100;template <class DataType>class CirQueue {public: // 构造函数 初始化一个空队列 CirQueue() { front = rear = QueueSize - 1; }; // 析构函数 ~CirQueue() {} // 入队 void EnQueue(DataType x); // 出队 DataType DeQueue(); // 取队头元素 DataType GetQueue(); // 判断队列是否为空 bool isEmpty() { return front == rear ? true : false; } // 输出队列 void PrintQueue();private: DataType data[QueueSize]; // 队头指针(实际是头索引) int front; // 队尾指针(实际是尾索引) int rear;};#endif /* CirQueue_h */
CirQueue.cpp
#include "CirQueue.h"template <class DataType>void CirQueue<DataType>::EnQueue(DataType x) { if ((rear+1) % QueueSize == front) throw "上溢"; rear = (rear+1) % QueueSize; data[rear] = x;}template <class DataType>DataType CirQueue<DataType>::DeQueue() { if (front == rear) throw "下溢"; front = (front + 1) % QueueSize; return data[front];}template <class DataType>DataType CirQueue<DataType>::GetQueue() { if (front == rear) throw "下溢"; return data[(front+1) % QueueSize];}template <class DataType>void CirQueue<DataType>::PrintQueue() { int p = front; cout << "frint "; while ((p+1) % QueueSize != (rear+1) % QueueSize - 1) { cout << data[(++p) % QueueSize] << " <- "; } cout << data[(rear+1) % QueueSize - 1]; cout << " rear" << endl;}
以上是模板,并提供了一个有助于理解的输出PrintQueue()函数。下面是对模板的测试,主函数如下。
main.cpp
#include <iostream>#include "CirQueue.cpp"int main(int argc, const char * argv[]) { CirQueue<int> queue = CirQueue<int>(); cout << "isEmpty : " << queue.isEmpty() << endl; for (int i = 2; i <= 11; i++) { queue.EnQueue(i); } queue.PrintQueue(); cout << "isEmpty : " << queue.isEmpty() << endl; cout << "GetQueue : " << queue.GetQueue() << endl; cout << "DeQueue : " << queue.DeQueue() << endl; cout << "DeQueue : " << queue.DeQueue() << endl; queue.PrintQueue(); cout << "GetQueue : " << queue.GetQueue() << endl; return 0;}
控制台输出如下:
2.用C++的模板来实现链队列,下面是代码:
LinkQueue.h
#ifndef LinkQueue_h#define LinkQueue_h#include <iostream>using namespace std;template<class DataType>struct Node { DataType data; Node<DataType> *next; Node<DataType>() { data = NULL; next = NULL; } Node<DataType>(DataType x) { data = x; next = NULL; }};template <class DataType>class LinkQueue {public: // 构造函数 初始化一个空队列 LinkQueue(); // 析构函数 释放结点 ~LinkQueue(); // 入队 void EnQueue(DataType x); // 出队 DataType DeQueue(); // 取队头元素 DataType GetQueue(); // 输出队列 void PrintQueue(); // 判断队列是否为空 bool isEmpty() { return front == rear ? true : false; }private: // 队头&队尾指针 Node<DataType> *front, *rear;};#endif /* LinkQueue_h */
LinkQueue.cpp
#include "LinkQueue.h"template <class DataType>LinkQueue<DataType>::LinkQueue() { Node<DataType> *s = new Node<DataType>(); front = rear = s;}template <class DataType>void LinkQueue<DataType>::EnQueue(DataType x) { Node<DataType> *s = new Node<DataType>(x); rear -> next = s; rear = s;}template <class DataType>DataType LinkQueue<DataType>::DeQueue() { if (front == rear) throw "下溢"; // 暂存队头结点 Node<DataType> *p = front -> next; // 暂存队列头数据 DataType x = p -> data; // 拼接链队列 front -> next = p -> next; // 处理尾指针 if (p -> next == NULL) rear = front; // 释放队头结点 delete p; return x;}template <class DataType>DataType LinkQueue<DataType>::GetQueue() { return front -> next -> data;}template <class DataType>void LinkQueue<DataType>::PrintQueue() { cout << "front "; Node<DataType> *p = front -> next; while (p -> next != NULL) { cout << p -> data << " <- "; p = p -> next; } cout << rear -> data << " rear" << endl;}template <class DataType>LinkQueue<DataType>::~LinkQueue<DataType>() { while (front != rear) { Node<DataType> *p = front -> next; front -> next = p -> next; if (p -> next == NULL) rear = front; cout << p -> data << "X "; delete p; } delete front; cout << endl;}
上面就是链队列的函数模板,为了便于理解和调试,也是提供了一个形象的PrintQueue()函数。代入测试模板,下面是主函数。
main.cpp
#include <iostream>#include "LinkQueue.cpp"int main(int argc, const char * argv[]) { LinkQueue<int> queue = LinkQueue<int>(); cout << "isEmpty : " << queue.isEmpty() << endl; for (int i = 2; i <= 11; i++) { queue.EnQueue(i); } queue.PrintQueue(); cout << "isEmpty : " << queue.isEmpty() << endl; cout << "GetQueue : " << queue.GetQueue() << endl; cout << "DeQueue : " << queue.DeQueue() << endl; cout << "DeQueue : " << queue.DeQueue() << endl; queue.PrintQueue(); cout << "GetQueue : " << queue.GetQueue() << endl; return 0;}
控制台输出如下:
三、 总结和心得
在模板的编写中,队列的模板相对容易一些。因为还没有对原始的队列进行扩展,数据结构和操作都十分少。只要一直朝着队列的特点(先进先出)进行设计就好。
在开发的时候,特别在多线程开发(用GCD)的时候,我也遇到了队列。在这个队列里面除了基本的先进先出,还有优先级的问题。所以,下一步要做的就是在队列里面加入优先级的功能。再下一步就是要模仿一下串行队列和并行队列了。
在空闲的时候更新的地方,大家可以捧一下场,嘿嘿~
新世界的大门 (๑•̀ㅂ•́)و✧
阅读全文
0 0
- 顺序队列和链队列的实现(实验3.2)
- 实验三、链队列和顺序队列
- 实验四 顺序队列和链队列
- 队列的实现-顺序队列和链队列
- 实验3:栈和队列的基本操作实现及其应用——顺序队列和链队列
- 实验3.2 顺序队列&链队列
- 实验四:顺序队列(循环队列)和链队列
- 实验三:顺序队列的实现
- 实验三之顺序队列的实现
- 实验4:栈和队列的基本操作实现及其应用之《顺序队列》
- 实验4:栈和队列的基本操作实现及其应用之《顺序队列》
- 队列 -- 顺序队列和链式队列类的实现
- 实验四 顺序栈和链队列的操作
- 队列的实现:顺序队列
- 顺序队列(循环队列)和链队列的C代码实现
- 实验三 顺序队列与链队列
- 顺序队列和链队列
- C++ 双向队列链式实现和队列的顺序实现
- SpringMVC中的controller
- Web安全,常见攻击防范
- 程序员必备之沟通的艺术
- leetcode 219. Contains Duplicate II 217. Contains Duplicate
- 【Java基础18_1】Map集合
- 顺序队列和链队列的实现(实验3.2)
- 基于注解开发项目中spring.xml文件的配置
- 123
- nmap端口扫描及邮件告警脚本
- 短除法求最大公约数(转自算法设计与分析第三版)
- 用类描述计算机中CPU的速度和硬盘的容量,要求Java应用程序有4个类,名字分别为:pc CPU harddisk 和Test ,其中TEST是主类。
- 前端面试题系列(1):doctype作用 标准模式与兼容模式
- 从零开始开发IoC依赖注入框架 -- containerx (深入研究Spring源码)
- Java 练习把一个文件从一个地方剪切到另一个地方