简体   繁体   中英

Implementation of Queue in C++

When I study the DataStructrue in my school, I implemented the Queue.

School's DataStructure class process is below.

  1. student implemnted the DS
  2. student submit in Domjudge
  3. Domjudge score the code based by test cases.

My freind implemented the Queue like below.

#include <iostream>
#include <string>
using namespace std;

class Node {
public:
    int data;
    Node* next;
    
    Node() {}
    Node(int e) {
        this->data = e;
        this->next = NULL;
    }
    ~Node(){}
};

class SLinkedList {
public:
    Node* head;
    Node* tail;
    
    SLinkedList() {
        head = NULL;
        tail = NULL;
    }
    
    void addFront(int X) {
        Node* v = new Node(X); // new Node
        
        if (head == NULL) {
            // list is empty
            head = tail = v;
        }else {
            v->next = head;
            head = v;
        }
    }
    
    int removeFront() {
        if (head == NULL) {
            return -1;
        }else{
            Node* tmp = head;
            int result = head->data;
            
            head = head->next;
            delete tmp;
            return result;
        }
    }
    
    int front() {
        if (head == NULL) {
            return -1;
        }else {
            return head->data;
        }
    }
    
    int rear() {
        if (head == NULL) {
            return -1;
        }else {
            return tail->data;
        }
    }
    
    int empty() {
        if (head == NULL) {
            return 1;
        }else {
            return 0;
        }
    }
    
    void addBack(int X) {
        Node* v = new Node(X);
        
        if (head == NULL) {
            head = tail = v;
        }else {
            tail->next = v;
            tail = v;
        }
    }
    
    ~SLinkedList() {}
};


class LinkedQ {
public:
    int n = 0;
    int capacity;
    Node* f;
    Node* r;
    SLinkedList Q;
    
    LinkedQ(int size) {
        capacity = size;
        f = NULL;
        r = NULL;
    }
    
    bool isEmpty() {
        return n == 0;
    }
    
    int size() {
        return n;
    }
    
    int front() {
        return Q.front();
    }
    
    int rear() {
        return Q.rear();
    }
    
    void enqueue(int data) {
        if (n == capacity) {
            cout << "Full\n";
        }else {
            Q.addBack(data);
            n++;
        }
    }
};

int main() {
    int s, n;
    string cmd;
    
    cin >> s >> n;
    
    listQueue q(s);
    
    for (int i = 0; i < n; i++) {
        cin >> cmd;
        
        if (cmd == "enqueue") {
            int x;
            cin >> x;
            
            q.enqueue(x);
        }else if (cmd == "size") {
            cout << q.size() << "\n";
        }else if (cmd == "isEmpty") {
            cout << q.isEmpty() << "\n";
        }else if (cmd == "front") {
            q.front();
        }else if (cmd == "rear") {
            q.rear();
        }
    }
    
}

And I implmented like this (Node class and main are same, So I pass the code)

#include <iostream>
#include <string>
using namespace std;

class Node{...};

class listQueue {
public:
    Node* head;
    Node* tail;
    int capacity;
    int n = 0;
    
    listQueue() {
        head = NULL;
        tail = NULL;
    }
    
    void enqueue(int X) {
        Node* v = new Node(X); // new Node

        if (n==capacity) {
           cout << "Full\n";
           return;
        }
        
        if (head == NULL) {
            // Queue is empty
            head = tail = v;
        }else {
            v->next = head;
            head = v;
        }
    }
    
    int front() {
        if (head == NULL) {
            return -1;
        }else {
            return head->data;
        }
    }
    
    int rear() {
        if (head == NULL) {
            return -1;
        }else {
            return tail->data;
        }
    }
    
    int empty() {
        if (head == NULL) {
            return 1;
        }else {
            return 0;
        }
    }
    
    ~listQueue() {}
};

test cases are just enqueue

but my friend is correct, and my code has occured memory over error.

So I check the usage of memory in Domjudge, My friend code and My code has very big gap in memory usage.

Why these two codes have memory usage gap big?

PS I can't speak English well. If there is something you don't understand, please tell me.

First, rear is incorrect. It checks head and return tail. It happens to correct when you first set head=tail=v but it might get wrong later.

    int rear() {
        if (head == NULL) {
            return -1;
        }else {
            return tail->data;
        }
    }

Check the if statement below:

    void enqueue(int X) {
        Node* v = new Node(X); // new Node 

        if (n==capacity) {     // You're leaking v;
           cout << "Full\n";
           return;
        }
        
        if (head == NULL) {
            // Queue is empty
            head = tail = v;
        }else {
            v->next = head;
            head = v;
        }
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM