• 数据结构和算法系列4 队列


    上一篇讲了栈,这一篇要总结的是我们常用的队列,我想从以下几个方面进行总结。

    1,什么是队列?
    2,队列的存储结构?
    3,队列的常用操作及实现代码?

    1,什么是队列

    1,首先,队列也是一种特殊的线性表,它是一种操作受限的线性表。它只允许在表的一端进行元素插入,而在另一端进行元素删除。允许插入的一端称为队尾(rear),允许删除的一端称为队头(font)。

    2,对于队列,与现实生活中的排队类似,新加入的成员总是在队尾,而排在队列最前面的总是最先离开队列,即先进先出,因此队列也称为先进先出表(FIFO)。

    2,队列的存储结构

    ds16

    实现代码:

    /// <summary>
        /// 封装顺序队列
        /// </summary>
        /// <typeparam name="T"></typeparam>
        public class SeqQueue<T>
        {
            private const int _maxSize = 100;
            public int MaxSize
            {
                get { return _maxSize; }
            }
    
            //保存数据
            public T[] data=new T[_maxSize];
    
            //头指针
            public int head;
    
            //尾指针
            public int rear;
        }

    3,队列的常见操作及实现代码

    1,初始化队列

    思路:构造一个空队列,即将头指针head和尾指针rear都设置为0。

    2,入队

    思路:若队列不满,则将数据x插入到尾指针rear指向的位置,然后再将rear加1。

    3,出队

    思路:若队列不空,则将头指针head加1,并返回被删除的元素。

    4,取队头

    思路:若队列不空,则返回队头元素。

    5,取队长

    思路:即尾指针rear-头指针head。

    6,判队空

    思路:只需要判断头指针head与尾指针是否相等即可

    7,判队满

    思路:只需判断尾指针与MaxSize是否相等即可

    注:在一个非空队列中,头指针始终指向队头元素,而尾指针始终指向队尾元素的下一个位置

    C#版:

    namespace DS.Model
    {
        /// <summary>
        /// 学生实体
        /// </summary>
        public class Student
        {
            public int ID { get; set; }
            public string Name { get; set; }
            public int Age { get; set; }
        }
    }
    
    namespace DS.BLL
    {
        /// <summary>
        /// 队列常见操作逻辑类
        /// </summary>
        public class SeqQueueBLL
        {
            /// <summary>
            /// 初始化
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="seqQueue"></param>
            /// <returns></returns>
            public static SeqQueue<T> Init<T>(SeqQueue<T> seqQueue)
            {
                seqQueue.head = 0;
                seqQueue.rear = 0;
                return seqQueue;
            }
    
            /// <summary>
            /// 入队
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="seqQueue"></param>
            /// <returns></returns>
            public static SeqQueue<T> Enter<T>(SeqQueue<T> seqQueue,T data)
            { 
                //是否队满
                if (IsFull(seqQueue)) return null;
    
                seqQueue.data[seqQueue.rear++] = data; //等价于seqQueue.data[seqQueue.rear] = data; seqQueue.rear++;
                return seqQueue;
            }
    
            /// <summary>
            /// 出队
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="seqQueue"></param>
            /// <returns></returns>
            public static T Dequeue<T>(SeqQueue<T> seqQueue)
            { 
                //是否队空
                if (IsEmpty(seqQueue)) return default(T);
    
                var data = seqQueue.data[seqQueue.head];
                seqQueue.head++;
                return data;
            }
    
            /// <summary>
            /// 取队头
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="seqQueue"></param>
            /// <returns></returns>
            public static T GetHead<T>(SeqQueue<T> seqQueue)
            { 
                //是否队空
                if(IsEmpty(seqQueue)) return default(T);
    
                return seqQueue.data[seqQueue.head];
            }
    
            /// <summary>
            /// 取队长
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="seqQueue"></param>
            /// <returns></returns>
            public static int GetLength<T>(SeqQueue<T> seqQueue)
            {
                return seqQueue.rear - seqQueue.head;
            }
            
    
            /// <summary>
            /// 判断是否队满
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="seqQueue"></param>
            /// <returns></returns>
            public static bool IsFull<T>(SeqQueue<T> seqQueue)
            {
                if (seqQueue.rear >= seqQueue.MaxSize) return true;
                return false;
            }
    
            /// <summary>
            /// 判断是否队空
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="seqQueue"></param>
            /// <returns></returns>
            public static bool IsEmpty<T>(SeqQueue<T> seqQueue)
            {
                if (seqQueue.head == seqQueue.rear) return true;
                return false;
            }
        }
    
        /// <summary>
        /// 封装顺序队列
        /// </summary>
        /// <typeparam name="T"></typeparam>
        public class SeqQueue<T>
        {
            private const int _maxSize = 100;
            public int MaxSize
            {
                get { return _maxSize; }
            }
    
            //保存数据
            public T[] data=new T[_maxSize];
    
            //头指针
            public int head;
    
            //尾指针
            public int rear;
        }
    }
    
    namespace SeqQueue.CSharp
    {
        class Program
        {
            static void Main(string[] args)
            {
                SeqQueue<Student> seqQueue = new SeqQueue<Student>();
    
                Console.WriteLine("********************初始化*******************
    ");
                SeqQueueBLL.Init(seqQueue);
                Console.WriteLine("当前队列的长度是:{0}", SeqQueueBLL.GetLength(seqQueue));
    
                Console.WriteLine("
    ********************入队*******************
    ");
                Console.WriteLine("插入五条数据到队列
    ");
                SeqQueueBLL.Enter(seqQueue, new Student { ID = 1, Name = "a", Age = 1 });
                SeqQueueBLL.Enter(seqQueue, new Student { ID = 2, Name = "b", Age = 2 });
                SeqQueueBLL.Enter(seqQueue, new Student { ID = 3, Name = "c", Age = 3 });
                SeqQueueBLL.Enter(seqQueue, new Student { ID = 4, Name = "d", Age = 4 });
                SeqQueueBLL.Enter(seqQueue, new Student { ID = 5, Name = "e", Age = 5 });
                Display(seqQueue);
    
                Console.WriteLine("
    ********************出队*******************
    ");
                Console.WriteLine("将队头出队
    ");
                Student student= SeqQueueBLL.Dequeue(seqQueue);
                Display(seqQueue);
    
                Console.WriteLine("
    ********************取队头*******************
    ");
                Student result= SeqQueueBLL.GetHead(seqQueue);
                Console.WriteLine("ID={0},Name={1},Age={2}
    ", result.ID, result.Name, result.Age);
    
                Console.WriteLine("
    ********************取队长*******************
    ");
                Console.WriteLine("当前队列中有{0}个元素
    ",SeqQueueBLL.GetLength(seqQueue));
    
                Console.ReadKey();
            }
    
            /// <summary>
            /// 展示数据
            /// </summary>
            /// <param name="seqQueue"></param>
            private static void Display(SeqQueue<Student> seqQueue)
            {
                Console.WriteLine("
    *****展示数据*****
    ");
    
                for (int i = seqQueue.head; i < seqQueue.rear; i++)
                {
                    Console.WriteLine("ID={0},Name={1},Age={2}
    ", seqQueue.data[i].ID, seqQueue.data[i].Name, seqQueue.data[i].Age);
                }
                Console.WriteLine("*****展示完毕*****
    ");
            }
        }
    }

    程序运行结果:

    ds17-1

    ds17-2

     

    C语言版:

    #include "stdio.h"    
    #include "stdlib.h"   
    #include "io.h"  
    #include "math.h"  
    #include "time.h"
    
    #define OK 1
    #define ERROR 0
    #define TRUE 1
    #define FALSE 0
    #define MAXSIZE 20
    
    typedef int Status; 
    typedef int ElemType;
    
    /* 队列的顺序存储结构 */
    typedef struct
    {
        ElemType data[MAXSIZE];
        int head;        /* 头指针 */
        int rear;        /* 尾指针,若队列不空,指向队列尾元素的下一个位置 */
    }SeqQueue;
    
    /*初始化*/
    Status Init(SeqQueue *seqQueue)
    {
        seqQueue->head=0;
        seqQueue->rear=0;
        return OK;
    }
    
    /*入队*/
    Status Enter(SeqQueue *seqQueue,ElemType e)
    {
        //是否队满
        if (IsFull(seqQueue)) return ERROR;
    
        seqQueue->data[seqQueue->rear]=e;
        seqQueue->rear++;
        return OK;
        
    }
    
    /*出队*/
    Status Dequeue(SeqQueue *seqQueue,ElemType *e)
    {
        //是否队空
        if (IsEmpty(seqQueue)) return ERROR;
        
        *e=seqQueue->data[seqQueue->head]; //为什么不能用e=seqQueue->data[seqQueue->head]
        seqQueue->head++;
        return OK;
    }
    
    /*取队头*/
    Status GetHead(SeqQueue *seqQueue,ElemType *e)
    {
        //是否队空
        if (IsEmpty(seqQueue)) return ERROR;
        
        *e=seqQueue->data[seqQueue->head];
        return OK;
    }
    
    /*取队长*/
    int GetLength(SeqQueue *seqQueue)
    {
        return seqQueue->rear-seqQueue->head;
    }
    
    /*是否队满*/
    Status IsFull(SeqQueue *seqQueue)
    {
        if (seqQueue->rear>=MAXSIZE) return TRUE;
        return FALSE;
    }
    
    /*是否队空*/
    Status IsEmpty(SeqQueue *seqQueue)
    {
        if (seqQueue->rear==seqQueue->head) return TRUE;
        return FALSE;
    }
    
    /*展示数据*/
    void Display(SeqQueue *seqQueue)
    {
        int i;
        printf("*****展示数据*****
    ");
        for (i=seqQueue->head;i<seqQueue->rear;i++)
        {
            printf("%d ",seqQueue->data[i]);
        }
        printf("
    *****展示完毕*****
    ");
    }
    
    void main()
    {
        SeqQueue seqQueue;
        ElemType e;
        Status i;
        int j;
    
        printf("***************初始化***************
    ");
        i=Init(&seqQueue);
        if (i==OK) printf("初始化成功!
    ");
        else printf("初始化失败!
    ");
    
        printf("
    ***************入队***************
    ");
        printf("插入五条数据到队列
    ");
        for (j=1;j<6;j++)
        {
            i=Enter(&seqQueue,j);
        }
        Display(&seqQueue);
    
        printf("
    ***************出队***************
    ");
        printf("将队头出队
    ");
        Dequeue(&seqQueue,&e);
        Display(&seqQueue);
    
        printf("
    ***************取队头***************
    ");
        GetHead(&seqQueue,&e);
        printf("当前队头元素是:%d
    ",e);
    
        printf("
    ***************取队长***************
    ");
        printf("当前队列中有%d个元素
    ",GetLength(&seqQueue));
        
        getchar();
    }

    程序运行结果:

    ds18

  • 相关阅读:
    redis有序集合性能 列表、集合、有序集合
    每天一个linux命令(26):用SecureCRT来上传和下载文件
    每天一个linux命令(25):linux文件属性详解
    每天一个linux命令(24):Linux文件类型与扩展名
    每天一个linux命令(23):Linux 目录结构
    每天一个linux命令(22):find 命令的参数详解
    每天一个linux命令(21):find命令之xargs
    每天一个linux命令(20):find命令之exec
    每天一个linux命令(19):find 命令概览
    每天一个linux命令(18):locate 命令
  • 原文地址:https://www.cnblogs.com/mcgrady/p/3221672.html
Copyright © 2020-2023  润新知