博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构和算法系列4 队列
阅读量:5140 次
发布时间:2019-06-13

本文共 6814 字,大约阅读时间需要 22 分钟。

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

1,什么是队列?

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

1,什么是队列

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

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

2,队列的存储结构

实现代码:

///     /// 封装顺序队列    ///     /// 
public class SeqQueue
{ 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{    ///     /// 学生实体    ///     public class Student    {        public int ID { get; set; }        public string Name { get; set; }        public int Age { get; set; }    }}namespace DS.BLL{    ///     /// 队列常见操作逻辑类    ///     public class SeqQueueBLL    {        ///         /// 初始化        ///         /// 
/// ///
public static SeqQueue
Init
(SeqQueue
seqQueue) { seqQueue.head = 0; seqQueue.rear = 0; return seqQueue; } ///
/// 入队 /// ///
///
///
public static SeqQueue
Enter
(SeqQueue
seqQueue,T data) { //是否队满 if (IsFull(seqQueue)) return null; seqQueue.data[seqQueue.rear++] = data; //等价于seqQueue.data[seqQueue.rear] = data; seqQueue.rear++; return seqQueue; } ///
/// 出队 /// ///
///
///
public static T Dequeue
(SeqQueue
seqQueue) { //是否队空 if (IsEmpty(seqQueue)) return default(T); var data = seqQueue.data[seqQueue.head]; seqQueue.head++; return data; } ///
/// 取队头 /// ///
///
///
public static T GetHead
(SeqQueue
seqQueue) { //是否队空 if(IsEmpty(seqQueue)) return default(T); return seqQueue.data[seqQueue.head]; } ///
/// 取队长 /// ///
///
///
public static int GetLength
(SeqQueue
seqQueue) { return seqQueue.rear - seqQueue.head; } ///
/// 判断是否队满 /// ///
///
///
public static bool IsFull
(SeqQueue
seqQueue) { if (seqQueue.rear >= seqQueue.MaxSize) return true; return false; } ///
/// 判断是否队空 /// ///
///
///
public static bool IsEmpty
(SeqQueue
seqQueue) { if (seqQueue.head == seqQueue.rear) return true; return false; } } ///
/// 封装顺序队列 /// ///
public class SeqQueue
{ 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
seqQueue = new SeqQueue
(); Console.WriteLine("********************初始化*******************\n"); SeqQueueBLL.Init(seqQueue); Console.WriteLine("当前队列的长度是:{0}", SeqQueueBLL.GetLength(seqQueue)); Console.WriteLine("\n********************入队*******************\n"); Console.WriteLine("插入五条数据到队列\n"); 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("\n********************出队*******************\n"); Console.WriteLine("将队头出队\n"); Student student= SeqQueueBLL.Dequeue(seqQueue); Display(seqQueue); Console.WriteLine("\n********************取队头*******************\n"); Student result= SeqQueueBLL.GetHead(seqQueue); Console.WriteLine("ID={0},Name={1},Age={2}\n", result.ID, result.Name, result.Age); Console.WriteLine("\n********************取队长*******************\n"); Console.WriteLine("当前队列中有{0}个元素\n",SeqQueueBLL.GetLength(seqQueue)); Console.ReadKey(); } ///
/// 展示数据 /// ///
private static void Display(SeqQueue
seqQueue) { Console.WriteLine("\n*****展示数据*****\n"); for (int i = seqQueue.head; i < seqQueue.rear; i++) { Console.WriteLine("ID={0},Name={1},Age={2}\n", seqQueue.data[i].ID, seqQueue.data[i].Name, seqQueue.data[i].Age); } Console.WriteLine("*****展示完毕*****\n"); } }}

程序运行结果:

 

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 20typedef 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("*****展示数据*****\n");    for (i=seqQueue->head;i
rear;i++) { printf("%d ",seqQueue->data[i]); } printf("\n*****展示完毕*****\n");}void main(){ SeqQueue seqQueue; ElemType e; Status i; int j; printf("***************初始化***************\n"); i=Init(&seqQueue); if (i==OK) printf("初始化成功!\n"); else printf("初始化失败!\n"); printf("\n***************入队***************\n"); printf("插入五条数据到队列\n"); for (j=1;j<6;j++) { i=Enter(&seqQueue,j); } Display(&seqQueue); printf("\n***************出队***************\n"); printf("将队头出队\n"); Dequeue(&seqQueue,&e); Display(&seqQueue); printf("\n***************取队头***************\n"); GetHead(&seqQueue,&e); printf("当前队头元素是:%d\n",e); printf("\n***************取队长***************\n"); printf("当前队列中有%d个元素\n",GetLength(&seqQueue)); getchar();}

程序运行结果:

转载于:https://www.cnblogs.com/mcgrady/p/3221672.html

你可能感兴趣的文章
modish产品介绍
查看>>
servlet 启动加载配置文件及初始化
查看>>
Beautiful Soup模块
查看>>
实验四
查看>>
OGNL
查看>>
win32 treeview
查看>>
day01
查看>>
【转】linux mknod命令解析
查看>>
SharePoint 2010/2013 隐藏的速度下拉菜单列表项
查看>>
NYOJ 24 素数的距离问题
查看>>
[leetcode]sort list
查看>>
Codeforces 444A DZY Loves Physics(图论)
查看>>
6.8 一般处理语言
查看>>
Android开发工具初体验兼AVD错误的解决方案
查看>>
Entity Framework: SaveChanges()和AcceptAllChanges()方法
查看>>
CSS: 水平居中
查看>>
左旋转字符串
查看>>
[创业趋势]基于P2P模式的大件物品租赁服务Qraft,可租游艇,飞机等[另类Airbnb]
查看>>
【论文笔记】缓冲区溢出漏洞研究与进展
查看>>
Redis 数据类型
查看>>