数据结构初阶–栈和队列(讲解+类模板实现)

栈的概念和结构

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out) 加粗样式的原则。
入栈:从栈顶放入数据的操作。
出栈:从栈顶取出元素的操作。

栈的实现

栈用链表和顺序表两种数据结构都可以实现,我们要确定选择哪一种更优,我们来分析一下。
链表栈:如果选择单链表的话,我们应该选择头当栈顶,尾当栈底,不然的话,每次存取数据都要遍历一遍链表。所以选双链表会比较好一点。
数组栈:访问栈顶的时间复杂度为O(1),相比链表栈比较优。
所以下面我们用顺序表来实现栈的这种数据结构。
结构如下:初始化栈的大小为5

#define InitSize  5
template <class datetype>
class Stack
{
public:
private:
    DateType* data;//&#x6808;&#x7A7A;&#x95F4;&#x6307;&#x9488;
    int size;//&#x6808;&#x5BB9;&#x91CF;
    int top;//&#x6808;&#x9876;&#xFF0C;&#x6808;&#x4E2D;&#x5143;&#x7D20;&#x4E2A;&#x6570;
};
</class>

栈要实现的接口有以下几个:

Stack();//&#x521D;&#x59CB;&#x5316;&#x6808;&#xFF0C;&#x521D;&#x59CB;&#x5316;&#x7684;&#x5927;&#x5C0F;&#x662F;5
Stack(const Stack& stack);//&#x62F7;&#x8D1D;&#x6784;&#x9020;&#x51FD;&#x6570;
Stack& operator=(const Stack& stack);//&#x7B49;&#x53F7;&#x8FD0;&#x7B97;&#x7B26;&#x7684;&#x91CD;&#x8F7D;
~Stack();//&#x9500;&#x6BC1;&#x6808;
bool ifFull();//&#x5224;&#x65AD;&#x6808;&#x662F;&#x5426;&#x6EE1;&#x4E86;
bool isEmpty();//&#x5224;&#x65AD;&#x6808;&#x662F;&#x5426;&#x4E3A;&#x7A7A;
void Push(const DateType& val);//&#x5165;&#x6808;
bool Pop(DateType &item);//&#x51FA;&#x6808;&#xFF0C;&#x5E76;&#x83B7;&#x53D6;&#x51FA;&#x6808;&#x5143;&#x7D20;
void ExpandStack();//&#x6269;&#x5BB9;
void PrintStack();//&#x6253;&#x5370;

初始化栈就是把结构体中的成员都初始化一下,方便后续的扩容等操作。
具体实现如下:

//&#x521D;&#x59CB;&#x5316;&#x6808;&#xFF0C;&#x521D;&#x59CB;&#x5316;&#x7684;&#x5927;&#x5C0F;&#x662F;5
Stack()
{
    data = new DateType[InitSize];
    if (data == NULL)
    {
        cout << "&#x5185;&#x5B58;&#x5206;&#x914D;&#x5931;&#x8D25;" << endl;
        exit(-1);
    }
    size = InitSize;
    top = 0;
}
//&#x62F7;&#x8D1D;&#x6784;&#x9020;&#x51FD;&#x6570;
Stack(const Stack& stack)
{
    this->data = new DateType[stack.size];
    if (data == NULL)
    {
        cout << "&#x5185;&#x5B58;&#x5206;&#x914D;&#x5931;&#x8D25;" << endl;
        exit(-1);
    }
    for (int i = 0; i < stack.size; i++)
    {
        this->data[i] = stack.data[i];
    }
    this->size = stack.size;
    this->top = stack.top;
}
//&#x5224;&#x65AD;&#x6808;&#x662F;&#x5426;&#x6EE1;&#x4E86;
bool ifFull()
{
    if (top == size)
    {
        return true;
    }
    return false;
}
//&#x6269;&#x5BB9;
void ExpandStack()
{
    this->size = this->size == 0 ? 4 : 2 * this->size;
    DateType* tmp = new DateType[this->size];
    if (tmp == NULL)
    {
        cout << "&#x5185;&#x5B58;&#x5206;&#x914D;&#x5931;&#x8D25;" << endl;
        exit(-1);
    }
    for (int i = 0; i < top; i++)
    {
        tmp[i] = data[i];
    }
    delete[] data;
    data = tmp;
}

压栈就是在栈顶插入元素,其中是肯定要考虑到扩容的问题,当 this->top == this->size时,就要考虑到扩容了,扩容也是像之前顺序表那样每次扩一倍,这样可以一定程度地减少扩容次数,但同时是会带来一定的空间消耗的。

//&#x5165;&#x6808;
void Push(const DateType& val)
{
    if (ifFull())
    {
        ExpandStack();
    }
    data[top++] = val;
}

出栈就是在栈顶pop掉一个元素,也就是 top-1指向的位置,只需要将top进行一个减1的操作即可。
与此同时,我们要确保此次栈不为空,所以要进行判断栈空的操作,防止程序崩溃。

//&#x51FA;&#x6808;&#xFF0C;&#x5E76;&#x83B7;&#x53D6;&#x51FA;&#x6808;&#x5143;&#x7D20;
bool Pop(DateType &item)
{
    if (isEmpty())
    {
        cout << "&#x6808;&#x4E3A;&#x7A7A;&#xFF0C;&#x65E0;&#x6CD5;&#x51FA;&#x6808;" << endl;
        return false;
    }
    item = data[--top];
    return true;
}

运算符重载的注意事项在前面的博客我已经介绍过了,尤其是赋值运算符,感兴趣的小伙伴可以去看看,这里要注意几点

  • 返回的是*this,对象本身
  • 不要自己给自己赋值
  • 要防止内存泄漏
  • 防止浅拷贝的发生
//&#x7B49;&#x53F7;&#x8FD0;&#x7B97;&#x7B26;&#x7684;&#x91CD;&#x8F7D;
Stack& operator=(const Stack& stack)
{
    //&#x9632;&#x6B62;&#x81EA;&#x8D4B;&#x503C;
    if (this == &stack)
    {
        return *this;
    }
    //&#x9632;&#x6B62;&#x5185;&#x5B58;&#x6CC4;&#x6F0F;
    if (data != NULL)
    {
        delete[] data;
    }
    //&#x9632;&#x6B62;&#x6D45;&#x62F7;&#x8D1D;
    this->data = new DateType[stack.size];
    if (data == NULL)
    {
        cout << "&#x5185;&#x5B58;&#x5206;&#x914D;&#x5931;&#x8D25;" << endl;
        exit(-1);
    }
    for (int i = 0; i < stack.top; i++)
    {
        this->data[i] = stack.data[i];
    }
    this->size = stack.size;
    this->top = stack.top;
    return *this;
}
//&#x6253;&#x5370;
void PrintStack()
{
    for (int i = 0; i < top; i++)
    {
        cout << data[i] << "  ";
    }
    cout << endl;
}

整体代码以及测试

#define _CRT_SECURE_NO_WARNINGS
#include<iostream> //&#x5F15;&#x5165;&#x5934;&#x6587;&#x4EF6;
#include<string>//C++&#x4E2D;&#x7684;&#x5B57;&#x7B26;&#x4E32;
using namespace std; //&#x6807;&#x51C6;&#x547D;&#x540D;&#x7A7A;&#x95F4;
#define InitSize  5
/*
&#x6808;,&#x5229;&#x7528;&#x987A;&#x5E8F;&#x8868;&#x5B9E;&#x73B0;
*/
template <class datetype>
class Stack
{
public:
    //&#x521D;&#x59CB;&#x5316;&#x6808;&#xFF0C;&#x521D;&#x59CB;&#x5316;&#x7684;&#x5927;&#x5C0F;&#x662F;5
    Stack()
    {
        data = new DateType[InitSize];
        if (data == NULL)
        {
            cout << "&#x5185;&#x5B58;&#x5206;&#x914D;&#x5931;&#x8D25;" << endl;
            exit(-1);
        }
        size = InitSize;
        top = 0;
    }
    //&#x62F7;&#x8D1D;&#x6784;&#x9020;&#x51FD;&#x6570;
    Stack(const Stack& stack)
    {
        this->data = new DateType[stack.size];
        if (data == NULL)
        {
            cout << "&#x5185;&#x5B58;&#x5206;&#x914D;&#x5931;&#x8D25;" << endl;
            exit(-1);
        }
        for (int i = 0; i < stack.size; i++)
        {
            this->data[i] = stack.data[i];

        }
        this->size = stack.size;
        this->top = stack.top;
    }
    //&#x7B49;&#x53F7;&#x8FD0;&#x7B97;&#x7B26;&#x7684;&#x91CD;&#x8F7D;
    Stack& operator=(const Stack& stack)
    {
        //&#x9632;&#x6B62;&#x81EA;&#x8D4B;&#x503C;
        if (this == &stack)
        {
            return *this;
        }
        //&#x9632;&#x6B62;&#x5185;&#x5B58;&#x6CC4;&#x6F0F;
        if (data != NULL)
        {
            delete[] data;
        }
        //&#x9632;&#x6B62;&#x6D45;&#x62F7;&#x8D1D;
        this->data = new DateType[stack.size];
        if (data == NULL)
        {
            cout << "&#x5185;&#x5B58;&#x5206;&#x914D;&#x5931;&#x8D25;" << endl;
            exit(-1);
        }
        for (int i = 0; i < stack.top; i++)
        {
            this->data[i] = stack.data[i];

        }
        this->size = stack.size;
        this->top = stack.top;
        return *this;
    }
    //&#x9500;&#x6BC1;&#x6808;
    ~Stack()
    {
        if (data != NULL)
        {
            delete[] data;
            data = NULL;
        }
    }
    //&#x5224;&#x65AD;&#x6808;&#x662F;&#x5426;&#x6EE1;&#x4E86;
    bool ifFull()
    {
        if (top == size)
        {
            return true;
        }
        return false;
    }
    //&#x5224;&#x65AD;&#x6808;&#x662F;&#x5426;&#x4E3A;&#x7A7A;
    bool isEmpty()
    {
        if (top == 0)
        {
            return true;
        }
        return false;
    }
    //&#x5165;&#x6808;
    void Push(const DateType& val)
    {
        if (ifFull())
        {
            ExpandStack();
        }
        data[top++] = val;
    }
    //&#x51FA;&#x6808;&#xFF0C;&#x5E76;&#x83B7;&#x53D6;&#x51FA;&#x6808;&#x5143;&#x7D20;
    bool Pop(DateType &item)
    {
        if (isEmpty())
        {
            cout << "&#x6808;&#x4E3A;&#x7A7A;&#xFF0C;&#x65E0;&#x6CD5;&#x51FA;&#x6808;" << endl;
            return false;
        }
        item = data[--top];
        return true;
    }
    //&#x6269;&#x5BB9;
    void ExpandStack()
    {
        this->size = this->size == 0 ? 4 : 2 * this->size;
        DateType* tmp = new DateType[this->size];
        if (tmp == NULL)
        {
            cout << "&#x5185;&#x5B58;&#x5206;&#x914D;&#x5931;&#x8D25;" << endl;
            exit(-1);
        }
        for (int i = 0; i < top; i++)
        {
            tmp[i] = data[i];
        }
        delete[] data;
        data = tmp;
    }
    //&#x6253;&#x5370;
    void PrintStack()
    {
        for (int i = 0; i < top; i++)
        {
            cout << data[i] << "  ";
        }
        cout << endl;
    }
private:
    DateType* data;//&#x6808;&#x7A7A;&#x95F4;&#x6307;&#x9488;
    int size;//&#x6808;&#x5BB9;&#x91CF;
    int top;//&#x6808;&#x9876;&#xFF0C;&#x6808;&#x4E2D;&#x5143;&#x7D20;&#x4E2A;&#x6570;
};
int main()
{
    Stack<int> stack;
    stack.Push(1);
    stack.Push(2);
    stack.Push(3);
    stack.Push(4);
    stack.Push(5);
    stack.PrintStack();
    cout << "-------------------------" << endl;
    int b = 0;
    stack.Pop(b);
    cout << b << endl;
    stack.Pop(b);
    cout << b << endl;
    stack.PrintStack();
    cout << "-------------------------" << endl;
    Stack<int> stack2(stack);
    stack2.PrintStack();
    cout << "-------------------------" << endl;
    Stack<int> stack3;
    stack3 = stack2;
    stack3.PrintStack();
    cout << "-------------------------" << endl;
    system("pause");
    return EXIT_SUCCESS;
}
</int></int></int></class></string></iostream>

队列的概念和结构

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头。

队列的结构,我们选取单链表来实现,秩序进行头删和为插的不足即可。如果选数组,那么每一次删头我们都要挪动一遍数据,这种方式不优,所以我们还是选取用单链表来实现。
定义的结构如下:

template<class datetype>
//&#x94FE;&#x961F;&#x7684;&#x7ED3;&#x70B9;&#x7C7B;&#x578B;
struct Node
{
    DateType data;
    Node<datetype> *next;
    Node(Node<datetype>* p = NULL)
    {
        next = p;
    }
    //&#x6784;&#x9020;&#x51FD;&#x6570;
    Node(DateType val, Node<datetype>* p = NULL)
    {
        data = val;
        next = p;
    }
};
</datetype></datetype></datetype></class>
template <class datetype>
class Queue
{
public:
private:
    //&#x58F0;&#x660E;&#xFF0C;&#x4E5F;&#x662F;&#x5B9A;&#x4E49;&#xFF0C;&#x53EA;&#x4E0D;&#x8FC7;&#x5B9A;&#x4E49;&#x7684;&#x662F;&#x6307;&#x9488;&#x7C7B;&#x578B;&#xFF0C;&#x4FDD;&#x5B58;&#x7684;&#x5E94;&#x8BE5;&#x662F;&#x5730;&#x5740;&#xFF0C;&#x672A;&#x521D;&#x59CB;&#x5316;
    //&#x961F;&#x5934;&#x6307;&#x9488;
    Node<datetype>* front;
    //&#x961F;&#x5C3E;&#x6307;&#x9488;
    Node<datetype>* rear;
};
</datetype></datetype></class>

队列的实现

Queue();//&#x6784;&#x9020;&#x51FD;&#x6570;&#xFF0C;&#x521D;&#x59CB;&#x5316;&#x961F;&#x5217;
~Queue();//&#x6790;&#x6784;&#x51FD;&#x6570;
bool QueuePush(const DateType& val);//&#x961F;&#x5C3E;&#x5165;&#x961F;
bool QueuePop(DateType& val);//&#x5BF9;&#x5934;&#x51FA;&#x961F;&#x5217;
bool getFront(DateType& val) const;//&#x83B7;&#x53D6;&#x5BF9;&#x5934;&#x5143;&#x7D20;&#x7684;&#x503C;
bool getRear(DateType& val);//&#x83B7;&#x53D6;&#x961F;&#x5C3E;&#x5143;&#x7D20;&#x7684;&#x503C;
void MakeEmpty();//&#x5C06;&#x961F;&#x5217;&#x6E05;&#x7A7A;
bool isEmpty() const;//&#x5224;&#x65AD;&#x961F;&#x5217;&#x662F;&#x5426;&#x4E3A;NULL
int getSize() const;//&#x8FD4;&#x56DE;&#x961F;&#x5217;&#x5143;&#x7D20;&#x7684;&#x4E2A;&#x6570;
void PrintQueue();//&#x8F93;&#x51FA;&#x961F;&#x5217;&#x5143;&#x7D20;

初始化很简单,只要将头指针和尾指针都置空。

//&#x6784;&#x9020;&#x51FD;&#x6570;
Queue()
{
    front = NULL;
    rear = NULL;
}
//&#x5224;&#x65AD;&#x961F;&#x5217;&#x662F;&#x5426;&#x4E3A;NULL
bool isEmpty() const
{
    if (front == NULL)
    {
        return true;
    }
    else
    {
        return false;
    }
}

出队就是进行单链表尾删的操作,要考虑链表为空时不能进行删除,还要注意的是只有一个节点进行删除是要改变尾指针的指向。

//&#x961F;&#x5C3E;&#x5165;&#x961F;&#x5217;
bool QueuePush(const DateType& val)
{
    if (front == NULL)
    {
        //&#x5982;&#x679C;&#x961F;&#x5217;&#x4E3A;&#x7A7A;&#xFF0C;&#x76F4;&#x63A5;&#x7528;&#x6307;&#x9488;&#x5F00;&#x8F9F;&#x7ED3;&#x70B9;
        front = rear = new Node<datetype>(val);
        if (front == NULL)
        {
            cout << "&#x5185;&#x5B58;&#x5206;&#x914D;&#x5931;&#x8D25;" << endl;
            return false;
        }
    }
    else
    {
        Node<datetype>* p = new Node<datetype>(val);
        rear->next = p;
        if (rear->next == NULL)
        {
            cout << "&#x5185;&#x5B58;&#x5206;&#x914D;&#x5931;&#x8D25;" << endl;
            return false;
        }
        //&#x66F4;&#x65B0;&#x5C3E;&#x7ED3;&#x70B9;
        rear = rear->next;
    }
    return true;
}
</datetype></datetype></datetype>

出队就是进行单链表尾删的操作,要考虑链表为空时不能进行删除,还要注意的是只有一个节点进行删除是要改变尾指针的指向。

bool QueuePop(DateType& val)
{
    //&#x5982;&#x679C;&#x961F;&#x5217;&#x4E3A;&#x7A7A;&#xFF0C;&#x4E0D;&#x5141;&#x8BB8;&#x51FA;&#x5217;
    if (isEmpty())
    {
        return false;
    }
    else
    {
        Node<datetype>* p = front;
        val = front->data;
        front = front->next;
        delete p;
        return true;
    }
}
</datetype>

首先要确保链表不为空,对头就是返回头节点的大小,队尾就是返回尾节点的大小。
具体实现如下:

//&#x83B7;&#x53D6;&#x5BF9;&#x5934;&#x5143;&#x7D20;&#x7684;&#x503C;
bool getFront(DateType& val) const
{
    if (isEmpty())
    {
        return false;
    }
    val = front->data;
    return true;
}
//&#x83B7;&#x53D6;&#x961F;&#x5C3E;&#x5143;&#x7D20;&#x7684;&#x503C;
bool getRear(DateType& val) {
    if (isEmpty())
    {
        return false;
    }
    val = rear->data;
    return true;
}

遍历一遍链表,同时进行计数操作,最后返回计数结果即可。

//&#x8FD4;&#x56DE;&#x961F;&#x5217;&#x5143;&#x7D20;&#x7684;&#x4E2A;&#x6570;
int getSize() const
{
    //&#x51FD;&#x6570;&#x8FD4;&#x56DE;&#x961F;&#x5217;&#x5143;&#x7D20;&#x7684;&#x4E2A;&#x6570;
    Node<datetype>* p = front;
    int count = 0;
    while (p != NULL)
    {
        ++count;
        p = p->next;
    }
    return count;
}
</datetype>

为了防止内存泄漏,动态内存申请的空间一定要我们自己手动释放,养成一个良好的习惯。所以要将链表的空间逐个释放。

//&#x5C06;&#x961F;&#x5217;&#x6E05;&#x7A7A;
void MakeEmpty()
{
    //&#x7F6E;&#x7A7A;&#x961F;&#x5217;&#xFF0C;&#x91CA;&#x653E;&#x94FE;&#x8868;&#x4E2D;&#x6240;&#x6709;&#x7684;&#x7ED3;&#x70B9;
    Node<datetype>* current;
    if (front != NULL)
    {
        current = front;
        front = front->next;
        delete current;
    }
}
</datetype>
//&#x8F93;&#x51FA;&#x961F;&#x5217;&#x5143;&#x7D20;
void PrintQueue()
{
    Node<datetype>* p = front;
    while (p != NULL)
    {
        cout << p->data << "  ";
        p = p->next;
    }
    cout << endl;
}
</datetype>

整体代码以及测试

#define _CRT_SECURE_NO_WARNINGS
#include<iostream> //&#x5F15;&#x5165;&#x5934;&#x6587;&#x4EF6;
#include<string>//C++&#x4E2D;&#x7684;&#x5B57;&#x7B26;&#x4E32;
using namespace std; //&#x6807;&#x51C6;&#x547D;&#x540D;&#x7A7A;&#x95F4;
/*
&#x961F;&#x5217;&#xFF0C;&#x5355;&#x94FE;&#x8868;&#x5B9E;&#x73B0;
*/
template<class datetype>
//&#x94FE;&#x961F;&#x7684;&#x7ED3;&#x70B9;&#x7C7B;&#x578B;
struct Node
{
    DateType data;
    Node<datetype> *next;
    Node(Node<datetype>* p = NULL)
    {
        next = p;
    }
    //&#x6784;&#x9020;&#x51FD;&#x6570;
    Node(DateType val, Node<datetype>* p = NULL)
    {
        data = val;
        next = p;
    }
};
template <class datetype>
class Queue
{
public:
    //&#x6784;&#x9020;&#x51FD;&#x6570;
    Queue()
    {
        front = NULL;
        rear = NULL;
    }
    //&#x6790;&#x6784;&#x51FD;&#x6570;
    ~Queue()
    {
        MakeEmpty();
    }
    //&#x961F;&#x5C3E;&#x5165;&#x961F;&#x5217;
    bool QueuePush(const DateType& val)
    {
        if (front == NULL)
        {
            //&#x5982;&#x679C;&#x961F;&#x5217;&#x4E3A;&#x7A7A;&#xFF0C;&#x76F4;&#x63A5;&#x7528;&#x6307;&#x9488;&#x5F00;&#x8F9F;&#x7ED3;&#x70B9;
            front = rear = new Node<datetype>(val);
            if (front == NULL)
            {
                cout << "&#x5185;&#x5B58;&#x5206;&#x914D;&#x5931;&#x8D25;" << endl;
                return false;
            }
        }
        else
        {
            Node<datetype>* p = new Node<datetype>(val);
            rear->next = p;
            if (rear->next == NULL)
            {
                cout << "&#x5185;&#x5B58;&#x5206;&#x914D;&#x5931;&#x8D25;" << endl;
                return false;
            }
            //&#x66F4;&#x65B0;&#x5C3E;&#x7ED3;&#x70B9;
            rear = rear->next;
        }
        return true;
    }
    //&#x5BF9;&#x5934;&#x51FA;&#x961F;&#x5217;
    bool QueuePop(DateType& val)
    {
        //&#x5982;&#x679C;&#x961F;&#x5217;&#x4E3A;&#x7A7A;&#xFF0C;&#x4E0D;&#x5141;&#x8BB8;&#x51FA;&#x5217;
        if (isEmpty())
        {
            return false;
        }
        else
        {
            Node<datetype>* p = front;
            val = front->data;
            front = front->next;
            delete p;
            return true;

        }
    }
    //&#x83B7;&#x53D6;&#x5BF9;&#x5934;&#x5143;&#x7D20;&#x7684;&#x503C;
    bool getFront(DateType& val) const
    {
        if (isEmpty())
        {
            return false;
        }
        val = front->data;
        return true;
    }
    //&#x83B7;&#x53D6;&#x961F;&#x5C3E;&#x5143;&#x7D20;&#x7684;&#x503C;
    bool getRear(DateType& val) {
        if (isEmpty())
        {
            return false;
        }
        val = rear->data;
        return true;
    }
    //&#x5C06;&#x961F;&#x5217;&#x6E05;&#x7A7A;
    void MakeEmpty()
    {
        //&#x7F6E;&#x7A7A;&#x961F;&#x5217;&#xFF0C;&#x91CA;&#x653E;&#x94FE;&#x8868;&#x4E2D;&#x6240;&#x6709;&#x7684;&#x7ED3;&#x70B9;
        Node<datetype>* current;
        if (front != NULL)
        {
            current = front;
            front = front->next;
            delete current;
        }
    }
    //&#x5224;&#x65AD;&#x961F;&#x5217;&#x662F;&#x5426;&#x4E3A;NULL
    bool isEmpty() const
    {
        if (front == NULL)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    //&#x8FD4;&#x56DE;&#x961F;&#x5217;&#x5143;&#x7D20;&#x7684;&#x4E2A;&#x6570;
    int getSize() const
    {
        //&#x51FD;&#x6570;&#x8FD4;&#x56DE;&#x961F;&#x5217;&#x5143;&#x7D20;&#x7684;&#x4E2A;&#x6570;
        Node<datetype>* p = front;
        int count = 0;
        while (p != NULL)
        {
            ++count;
            p = p->next;
        }
        return count;
    }
    //&#x8F93;&#x51FA;&#x961F;&#x5217;&#x5143;&#x7D20;
    void PrintQueue()
    {
        Node<datetype>* p = front;
        while (p != NULL)
        {
            cout << p->data << "  ";
            p = p->next;
        }
        cout << endl;
    }
private:
    //&#x58F0;&#x660E;&#xFF0C;&#x4E5F;&#x662F;&#x5B9A;&#x4E49;&#xFF0C;&#x53EA;&#x4E0D;&#x8FC7;&#x5B9A;&#x4E49;&#x7684;&#x662F;&#x6307;&#x9488;&#x7C7B;&#x578B;&#xFF0C;&#x4FDD;&#x5B58;&#x7684;&#x5E94;&#x8BE5;&#x662F;&#x5730;&#x5740;&#xFF0C;&#x672A;&#x521D;&#x59CB;&#x5316;
    //&#x961F;&#x5934;&#x6307;&#x9488;
    Node<datetype>* front;
    //&#x961F;&#x5C3E;&#x6307;&#x9488;
    Node<datetype>* rear;
};
int main()
{
    Queue<int> que;
    que.QueuePush(1);
    que.QueuePush(2);
    que.QueuePush(3);
    que.QueuePush(4);
    que.PrintQueue();
    cout << "----------------------" << endl;
    int b = 0;
    que.QueuePop(b);
    cout << b << endl;
    que.QueuePop(b);
    cout << b << endl;
    que.PrintQueue();
    cout << "----------------------" << endl;
    int c = 0;
    que.getFront(c);
    cout << c << endl;
    que.PrintQueue();
    cout << que.getSize() << endl;
    cout << "----------------------" << endl;
    system("pause");
    return EXIT_SUCCESS;
}
</int></datetype></datetype></datetype></datetype></datetype></datetype></datetype></datetype></datetype></class></datetype></datetype></datetype></class></string></iostream>

Original: https://www.cnblogs.com/yzsn12138/p/16929865.html
Author: 一只少年AAA
Title: 数据结构初阶–栈和队列(讲解+类模板实现)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/797780/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球