队列(Queue)——class Stack 和 class Stack T 实现

这是对于Queue类的实现

PS:这是队列链式存储(带头节点)的类和模板实现,静态循环序列本质也只是封装类和套模板

class Stack实现代码如下:

myqueue.h

#include<stdio.h>
#include<stdlib.h>
struct Node
{
        char data;
        Node* next;
};
struct Queue
{
        Node*front;
        Node*rear;
};
class myqueue
{
    public:
        myqueue();
        ~myqueue();
        bool enQueueEmpty();
        void enQueue(char ch);
        char deQueue();
        void resetQueue();
    private:
        Queue*q;
};

myqueue.cpp

#include "myqueue.h"
myqueue::myqueue()
{
    q->front=q->rear=(Node*)malloc(sizeof(Node));
    q->front->next=NULL;
}

myqueue::~myqueue()
{
    resetQueue();
    free(q->front);
}

bool myqueue::enQueueEmpty()
{
    return q->front==q->rear;
}

void myqueue::enQueue(char ch)
{
    Node*cur = (Node*)malloc(sizeof(Node));
    cur->data=ch;
    cur->next=NULL; //插尾巴上,类似于尾插法
    q->rear->next=cur;
    q->rear=cur;
}

char myqueue::deQueue()
{
    char ch=q->front->next->data;
    if(q->front->next==q->rear)  //若为空队列
    {
        q->rear=q->front;
        free(q->front->next);
        q->front->next=NULL;
    }
    else
    {
        Node* cur=q->front->next;
        q->front->next=cur->next;
        free(cur);
    }
    return ch;
}

void myqueue::resetQueue()
{
    Node*head=q->front->next;
    q->front->next=NULL;
    q->rear=q->front;
    Node * t;
    while(head)
    {
        t=head;
        head=head->next;
        free(t);
    }
}
 

main函数

#include <iostream>
#include "myqueue.h"
using namespace std;
int main()
{
    myqueue q;
    for(char ch='A';ch<='Z';ch++)
        q.enQueue(ch);
    //q.resetQueue();
    while(!q.enQueueEmpty())
        printf("%c ",q.deQueue());
    q.~myqueue();
    return 0;
}
 

class Stack T 模板实现代码如下:

#include<stdio.h>
#include<stdlib.h>
template<typename T>
class myqueue   //这里需要把struct定义放在类的定义中
{
    public:
        myqueue();
        ~myqueue();
        bool enQueueEmpty();
        void enQueue(T ch);
        T deQueue();
        void resetQueue();
    protected:
        struct Node
        {
                T data;
                Node* next;
        };
        struct Queue
        {
                Node*front;
                Node*rear;
        };
    private:
        Queue*q;
};

//这里需要再头文件中放置全部的模板声明和定义,若放在cpp里编译不通过
template<typename T> //每个函数前都要写,注意格式,其他跟上面的 class 一样
myqueue<T>::myqueue()
{
    q->front=q->rear=(Node*)malloc(sizeof(Node));
    q->front->next=NULL;
}

template<typename T>
myqueue<T>::~myqueue()
{
    resetQueue();
    free(q->front);
}

template<typename T>
bool myqueue<T>::enQueueEmpty()
{
    return q->front==q->rear;
}

template<typename T>
void myqueue<T>::enQueue(T ch)
{
    Node*cur = (Node*)malloc(sizeof(Node));
    cur->data=ch;
    cur->next=NULL; //插尾巴上,类似于尾插法
    q->rear->next=cur;
    q->rear=cur;
}

template<typename T>
T myqueue<T>::deQueue()
{
    T ch=q->front->next->data;
    if(q->front->next==q->rear)  //若为空队列
    {
        q->rear=q->front;
        free(q->front->next);
        q->front->next=NULL;
    }
    else
    {
        Node* cur=q->front->next;
        q->front->next=cur->next;
        free(cur);
    }
    return ch;
}

template<typename T>
void myqueue<T>::resetQueue()
{
    Node*head=q->front->next;
    q->front->next=NULL;
    q->rear=q->front;
    Node * t;
    while(head)
    {
        t=head;
        head=head->next;
        free(t);
    }
}

main函数

#include <iostream>
#include "myqueue.h"
using namespace std;
int main()
{
    myqueue<int> q;
#if 0 //char
    for(char ch='A';ch<='Z';ch++)
        q.enQueue(ch);
#endif
    for(int ch='A';ch<='Z';ch++)
        q.enQueue(ch);
    //q.resetQueue();
    while(!q.enQueueEmpty())
        printf("%d ",q.deQueue());
    q.~myqueue();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42513339/article/details/81269606
今日推荐