zoukankan      html  css  js  c++  java
  • 【Weiss】【第03章】练习3.25:数组模拟队列

    【练习3.25】

    编写实现队列的例程,使用

    a.链表

    b.数组

    Answer:

    在这章一开头就已经写了个链表的队列例程了,所以实际上只要做b小题就可以。

    数组模拟队列和链表的两点小不同是:

    ①、数组空间有限,入队需要检测数组是否已经满

    ②、数组经过几次操作后,rear可能绕回front前面,所以许多操作都要用模来实现。

    测试代码:

     1 #include <iostream>
     2 #include "queue.h"
     3 using namespace std;
     4 using namespace queue;
     5 template class Queue<int>;
     6 int main(void)
     7 {
     8     Simu_Queue<int> test(6);
     9     //测试插入
    10     test.enqueue(2);
    11     test.enqueue(3);
    12     test.enqueue(5);
    13     test.enqueue(7);
    14     test.enqueue(11);
    15     test.enqueue(13);
    16     test.enqueue(17);
    17     test.traverse();
    18     cout << endl;
    19     //测试删除
    20     test.dequeue();
    21     test.dequeue();
    22     test.dequeue();
    23     test.traverse();
    24     cout << endl;
    25     //测试绕数组遍历
    26     test.enqueue(17);
    27     test.enqueue(19);
    28     test.enqueue(23);
    29     test.traverse();
    30     cout << endl;
    31 
    32     system("pause");
    33 }
    View Code

    实现代码:

     1 //练习3.25新增,用数组模拟队列
     2 template <typename T> class Simu_Queue
     3 {
     4 public:
     5     Simu_Queue() :head(nullptr), front(0), rear(0), size(0){}
     6     Simu_Queue(unsigned int _maxsize) :front(0), rear(0), maxsize(_maxsize){ head = new T[maxsize + 1]; }
     7     Simu_Queue(const Simu_Queue& another)
     8     {
     9         front = another.front;
    10         rear = another.rear;
    11         maxsize = another.maxsize;
    12         head = new T[maxsize + 1];
    13         for (unsigned i = 0; i < maxsize + 1; ++i)
    14             head[i] = another.head[i];
    15     }
    16     ~Simu_Queue()
    17     { 
    18         delete[] head; 
    19         front = rear = maxsize = 0;
    20         head = nullptr;
    21     }
    22     Simu_Queue& operator=(const Simu_Queue& another)
    23     {
    24         if (this != &another)
    25         {
    26             delete[] head;
    27             front = another.front;
    28             rear = another.rear;
    29             maxsize = another.maxsize;
    30             head = new T[maxsize + 1];
    31             for (unsigned i = 0; i < maxsize + 1; ++i)
    32                 head[i] = another.head[i];
    33         }
    34     }
    35 public:
    36     //返回最大元素量
    37     unsigned int size()const{ return maxsize; }
    38     //返回当前元素量
    39     unsigned int length()const{ return front <= rear ? rear - front : rear + maxsize + 1 - front; }
    40     //判断是否为空
    41     bool empty()const{ return front == rear; }
    42     //入队
    43     bool enqueue(const T &item)
    44     {
    45         if ((rear + 1) % (maxsize + 1) != front)
    46         {
    47             head[rear] = item;
    48             rear = (rear + 1) % (maxsize + 1);
    49             return true;
    50         }
    51         return false;
    52     }
    53     //出队
    54     bool dequeue()
    55     {
    56         if (rear != front)
    57         {
    58             front = (front + 1) % (maxsize + 1);
    59             return true;
    60         }
    61         return false;
    62     }
    63     //输出队列元素
    64     void traverse()const
    65     {
    66         unsigned int temp = front;
    67         while (temp != rear)
    68         {
    69             cout << " " << head[temp] << flush;
    70             temp = (temp + 1) % (maxsize + 1);
    71         }
    72     }
    73 private:
    74     T* head = nullptr;
    75     unsigned int front;
    76     unsigned int rear;
    77     unsigned int maxsize;
    78 };
  • 相关阅读:
    LeetCode 345. Reverse Vowels of a String 题解
    LeetCode 344. Reverse String 题解
    LeetCode 27. Remove Element 题解
    LeetCode 61. Rotate List 题解
    LeetCode 19.Remove Nth Node From End of List 题解
    Android耗电量
    Android 使用adb查看和修改电池信息
    Android AOP AspectJ 插桩
    Flask相关用法
    Monkey日志信息的11种Event percentage
  • 原文地址:https://www.cnblogs.com/catnip/p/4355061.html
Copyright © 2011-2022 走看看