洋葱汪的博客

学习笔记记录

第36课 - 队列的概念及实现(上)

1、队列的概念及实现

            队列是—种特殊的线性表 

            队列仅能在线性表的两端进行操作 

                -队头(Front) : 取出数据元素的—端 

                -队尾(Rear) : 插入数据元素的—端


    队列的特性 

        -先进先出(First In First Out


 

    队列的操作 

            -创建队列( Queue( ) )  

            -销毁队列(~Queue( ) ) 

            -清空队列( clear( ) ) 

            -进队列( add( ) ) 

            -出队列( remove( ) ) 

            -获取队头元素( front( ) ) 

            -获取队列的长度( length( ) )


    队列的实现

        

        



    队列的顺序实现 



    StaticQueue设计要点  

         - 类模板

                使用原生数组作为队列的存储空间 

                使用模板参数决定队列的最大容量 

        


    StaticQueue实现要点(循环计数法) 

        -关键操作 

                进队列: m_space[m_rear] = e; m_rear = (m_rear + 1) % N; 

                出队列: m_front = (m_front + 1) % N; 

        -队列的状态 

                队空: (m_length == 0) && (m_front == m_rear) 

                队满: (m_length == N) && (m_front == m_rear)


2、编程实验 

基于顺序存储结构的队列     StaticQueue.h

Queue.h

#ifndef QUEUE_H
#define QUEUE_H

#include"Object.h"

namespace DTLib
{

template <typename T>
class Queue : public Object
{
public:
    virtual void add(const T& e) = 0;
    virtual void remove() = 0;
    virtual T front() const = 0;
    virtual void clear() = 0;
    virtual int length() const = 0;
};
}
#endif // QUEUE_H

StaticQueue.h

#ifndef STATICQUEUE_H
#define STATICQUEUE_H

#include"Queue.h"
#include"Exception.h"

namespace DTLib
{

template < typename T ,int N>
class StaticQueue : public Queue<T>
{
protected:
    T m_space[N];
    int m_front;
    int m_rear;
    int m_length;
public:
    StaticQueue()
    {
        m_front = 0;
        m_rear = 0;
        m_length = 0;
    }
    int capacity() const
    {
        return N;
    }
    void add(const T& e)
    {
        if(m_length < N)
        {
            m_space[m_rear] = e;
            m_rear = (m_rear + 1) % N;
            m_length++;
        }
        else
        {
            THROW_EXCEPTION(InvalidOperationException,"No space in current queue ...");
        }
    }
    void remove()
    {
        if(m_length > 0)
        {
            m_front = (m_front + 1) % N;
            m_length--;
        }
        else
        {
            THROW_EXCEPTION(InvalidOperationException,"No element in current queue ...");
        }
    }
    T front() const
    {
        if(m_length > 0)
        {
            return m_space[m_front];
        }
        else
        {
            THROW_EXCEPTION(InvalidOperationException,"No element in current queue ...");
        }
    }
    void clear()
    {
        m_front = 0;
        m_rear = 0;
        m_length = 0;
    }
    int length() const
    {
        return m_length;
    }
};
}
#endif // STATICQUEUE_H

main.cpp

#include <iostream>
#include"StaticQueue.h"

using namespace std;
using namespace DTLib;



int main()
{
    StaticQueue<int,5> queue;

    for(int i=0;i<5;i++)
    {
        queue.add(i);
    }

    while(queue.length() > 0)
    {
        cout<<queue.front()<<endl;

        queue.remove();
    }

    return 0;
}


                    


3、小结

            队列是一种特殊的线性表,具有先进先出的特性 

            队列只允许在线性表的两端进行操作,—端进,—端出

            StaticQueue使用原生数组作为内部存储空间

            StaticQueue最大容量由模板参数决定 

            StaticQueue采用循环计数法提高队列操作的效率 



阅读更多
版权声明:该博客笔记均整理于狄泰软件,未经博主允许,禁止将笔记转载 https://blog.csdn.net/qq_39654127/article/details/80338966
个人分类: 数据结构实战开发
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

第36课 - 队列的概念及实现(上)

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭