顺序队列和链队列的实现(实验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
原创粉丝点击