Queue with Template

Description

Please modify class Queue’s declaration and definition so as to finish the test from main.cpp…

Attention: please use template you have learned in the class to finish this assignment

Here is my answer:

//queue.h:
template<typename T>
class Queue {
  public:
    Queue() {
        front_node = NULL;
        back_node = NULL;
        node_num = 0;
    }

    Queue(const Queue & another) {
        Node* temp = another.front_node;
        node_num = 0;
        front_node = back_node = NULL;
        for (int i = 0; i < another.node_num; ++i) {
            push(temp->element);
            temp = temp->next;
        }
    }

    ~Queue() {
        while (node_num) {
            pop();
        }
    }

    bool empty() {return node_num == 0;}

    int size() {return node_num;}

    T front() const {
        if (front_node)
            return front_node->element;
    }

    T back() const {
        if (back_node)
            return back_node->element;
    }

    void push(T element) {
        if (front_node == NULL) {
            front_node = new Node(element);
            back_node = front_node;
            node_num++;
        } else {
            Node* current = new Node(element);
            back_node->next = current;
            back_node = current;
            node_num++;
        }
    }

    void pop() {
        if (front_node) {
            Node* temp = front_node;
            front_node = front_node->next;
            delete temp;
            node_num--;
            if (node_num == 0)
                back_node = NULL;
        }
    }

    void swap(Queue & queue) {
        Node* temp = this->front_node;
        this->front_node = queue.front_node;
        queue.front_node = temp;
        temp = this->back_node;
        this->back_node = queue.back_node;
        queue.back_node = temp;
        int size = this->node_num;
        this->node_num = queue.node_num;
        queue.node_num = size;
    }

  private:
    struct Node {
      T element;
      Node* next;
      Node(T ele, Node* n = NULL) {
        element = ele;
        next = n;
      }
    };
    Node* front_node;
    Node* back_node;
    int node_num;
};
//test.cpp:
#include <iostream>
#include "Queue.h"
#include <string>
#include <sstream>

using namespace std;

class Job {
    public:
        explicit Job(int pri = 0) {
            id = number++;
            priority = pri;
        }
        string toString() {
            stringstream ss;
            ss << "[" << id << ":" << priority << "]";
            return ss.str();
        }
    private:
        static int number;
        int id;
        int priority;
};

int Job::number = 0;

template<class T>
void print(Queue<T> queue) {
    while (!queue.empty()) {
        cout << queue.front() << " ";
        queue.pop();
    }
    cout << endl;
}

int main() {
    // test case 1: integer..
    Queue<int> que;
    int m, n;
    cin >> m >> n;
    for (int i = 0; i < m; i++) que.push(i + 0.01);
    for (int i = 0; i < n; i++) que.pop();
    if (!que.empty()) {
        cout << que.front() << endl;
        cout << que.back() << endl;
    }
    cout << "The size is: " << que.size() << endl;
    if (que.empty()) cout << "The queue is empty!" << endl;
    else cout << "The queue is NOT empty!" << endl;

    // test case 2: double..
    Queue<double> que1;
    cin >> m >> n;
    for (int i = 0; i < m; i++) que1.push(i + 0.01);
    for (int i = 0; i < n; i++) que1.pop();
    if (!que1.empty()) {
        cout << que1.front() << endl;
        cout << que1.back() << endl;
    }
    cout << "The size is: " << que1.size() << endl;
    if (que1.empty()) cout << "The queue is empty!" << endl;
    else cout << "The queue is NOT empty!" << endl;

    // test case 3: user defined class..
    Queue<Job> que2;
    cin >> m >> n;
    for (int i = 0; i < m; i++) que2.push(Job(i));
    for (int i = 0; i < n; i++) que2.pop();

    if (!que2.empty()) {
        cout << que2.front().toString() << endl;
        cout << que2.back().toString() << endl;
    }
    cout << "The size is: " << que2.size() << endl;
    if (que2.empty()) cout << "The queue is empty!" << endl;
    else cout << "The queue is NOT empty!" << endl;

    // test case 4: swap function..
    Queue<int> que3, que4;
    for (int i = 0; i < m; i++) que3.push(i);
    for (int i = 0; i < n; i++) que4.push(m - i);
    cout << "Before Swap...." << endl;
    print(que3);
    print(que4);

    que3.swap(que4);
    cout << "After Swap...." << endl;
    cout << endl;
    print(que3);
    print(que4);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
To implement a resource pool in C++, you can use the concept of object pooling. Object pooling is a design pattern that allows you to reuse objects instead of creating and destroying them frequently, which can be expensive in terms of memory allocation and deallocation. Here's a basic example of how you can implement a resource pool in C++: ```cpp #include <queue> #include <mutex> #include <condition_variable> template<typename T> class ResourcePool { private: std::queue<T*> pool; std::mutex mutex; std::condition_variable condition; public: ResourcePool(int initialSize) { for (int i = 0; i < initialSize; ++i) { pool.push(new T()); } } ~ResourcePool() { while (!pool.empty()) { delete pool.front(); pool.pop(); } } T* acquireResource() { std::unique_lock<std::mutex> lock(mutex); if (pool.empty()) { // Wait until a resource is available condition.wait(lock); } T* resource = pool.front(); pool.pop(); return resource; } void releaseResource(T* resource) { std::unique_lock<std::mutex> lock(mutex); pool.push(resource); // Notify waiting threads that a resource is available condition.notify_one(); } }; ``` In this example, the `ResourcePool` class uses a queue to store the resources. The `acquireResource` function is responsible for acquiring a resource from the pool. If the pool is empty, it waits until a resource becomes available using the `std::condition_variable`. The `releaseResource` function is used to release a resource back into the pool. You can customize this implementation based on your specific requirements. For example, you can add additional functions to initialize or resize the pool dynamically.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值