`
东边日出西边雨
  • 浏览: 258089 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

队列的链式存储结构

阅读更多

    队列也是一种特殊的线性表,只不过是一头进另一头出罢了。

 

    下面是队列的基本操作。

 

/* queue.h */

#ifndef QUEUE_H
#define QUEUE_H

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

#define TYPE int

typedef struct _Node {
    TYPE data;
    struct _Node* next;
} Node, *Pnode;


class Queue {

private:
    Pnode front;
    Pnode rear;
public:
    Queue();
    ~Queue();
    bool InitQueue();
    void DestroyQueue();
    void ClearQueue();
    bool QueueEmpty();
    int QueueLength();
    bool GetHead(TYPE&);
    bool EnQueue(TYPE);
    bool DeQueue(TYPE&);
    void QueueTraverse();

};

#endif
 
/* queue.cpp */

#include "queue.h"

Queue::Queue() {
    cout<<"Constructor"<<endl;
    front = NULL;
    rear = NULL;
}

Queue::~Queue() {
    cout<<"Destructor"<<endl;
    DestroyQueue();
}

bool Queue::InitQueue() {

    Pnode p = new Node;

    if (!p) {
        cout<<"Init Queue fail"<<endl;
        return false;
    }

    front = p;
    rear = p;

    return true;
}

void Queue::DestroyQueue() {

    if (!rear) {
        return;
    }

    while (front) {
        Pnode p = front;
        front = front->next;
        delete p;
    }
    rear = NULL;

}

void Queue::ClearQueue() {

    if (!rear) {
        cout<<"Queue not exist"<<endl;
        return;
    }

    while (front != rear) {
        Pnode p = front;
        front = front->next;
        delete p;
    }

    memset(front, 0, sizeof(Node));

}

bool Queue::QueueEmpty() {

    if (!rear) {
        cout<<"Queue not exist"<<endl;
        return false;
    }

    if (front == rear) {
        return true;
    }

    return false;
}

int Queue::QueueLength() {

    if (!rear) {
        cout<<"Queue not exist"<<endl;
        return 0;
    }

    int n = 0;
    Pnode p = front;
    while (p != rear) {
        n++;
        p = p->next;
    }

    return n;
}

bool Queue::GetHead(TYPE& e) {

    if (!rear) {
        cout<<"Queue not exist"<<endl;
        return false;
    }

    if (front == rear) {
        return false;
    }

    e = front->next->data;

    return true;
}

bool Queue::EnQueue(TYPE data) {

    if (!rear) {
        cout<<"Queue not exist"<<endl;
        return false;
    }

    Pnode p = new Node;

    if (!p) {
        cout<<"EnQueue fail"<<endl;
        return false;
    }

    p->data = data;
    rear->next = p;
    rear = p;
    return true;
}

bool Queue::DeQueue(TYPE& e) {

    if (!rear) {
        cout<<"Queue not exist"<<endl;
        return false;
    }

    if (front == rear) {
        cout<<"debug empty"<<endl;
        return false;
    }

    e = front->next->data;
    Pnode p = front->next;
    front->next = front->next->next;

    if (p == rear) {
        rear = front;
    }

    delete p;
    return true;
}

void Queue::QueueTraverse() {

    if (!rear) {
        cout<<"Queue not exist"<<endl;
        return;
    }

    Pnode p = front->next;

    while (p) {
        cout<<p->data<<" ";
        p = p->next;
    }
    cout<<endl;
}
 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics