原来你是这样的数据结构之队列结构

什么是队列结构:

队列是允许在一端进行插入操作,而在另一端进行删除操作的的线性表。
队列是一种先进先出的(First in First out)的线性表,简称为FIFO.允许插入的一端称为队尾,允许删除的一端称为队头。
如果从数据存储结构进一步划分,队列结构包括两类.

  • 顺序队列存储结构:即使用一组地址连续的内存单元依次保存队列中的数据,在程序中,可以定义一个指定大小的结构数组作为队列.
  • 即使用链表形式保存队列中各元素的值.

典型的队列结构如下图:

image

举两个生活中的例子。相信大家,在用电脑工作娱乐时,都会碰到这样的现象。当我们点击程序或进行其他操作时,电脑处于死机状态。正当我们准备Reset时,它突然像打了鸡血似的,突然把刚才我们的操作,按顺序执行了一遍。之所以会出现这个现象,是因为操作系统的多个程序,需要通过一个管道输出,而按先后顺序排队造成的。

还有有个例子,在我们打客服热线时,有时会出现等待的现象。当其他客户挂断电话,客服人员才会接通我们的电话。因为客服人员相对于客户而言,总是不够的,当客户量大于客服人员时,就会造成排队等待的想象。

操作系统、客服系统,都是应用了一种数据结构才实现了这种先进先出的排队功能,这个数据结构就是队列。

队列的基本操作一般只有两个:

  • 入队列:将一个元素添加到队尾(相当于到队列最后排队等候)
  • 出队列:将队头的元素依次取出,同时删除该元素,使后一个元素成为队头.
    除了这两个主要的还有初始化队列,获取队列长度等简单操作.下面我们就分析怎么用java实现队列结构.

准备数据

static final int QUEUELEN = 15;

class DATA4
{
    String name;
    int age;
}

class SQType
{
    DATA4 [] data = new DATA4[QUEUELEN];           //队列数组
    int head;                                      //队头
    int tail;                                      //队尾
}

首先我们定义了一个队列的最大长度QUEUELEN,然后定义了队列中结点的数据DATA4,SQType是我们定义的队列结构类.其中数组
data是用来保存队列数据的,head表示队列的队头,tail是表示队列的对尾,每一次添加一个元素的时候,就是入队列.我们把元素指向当前tail所指向的位置,tail所指向的就是队尾,现在原来队尾就是空的,现在添加元素了,我们把tail指向下一个空,我们取出数据的时候,也就是出队列.队头肯定是有数据的,所以我们直接通过head取出一个数据,然后把head指向下一个元素,也就是让下一个元素当队头.Ok,队列的入队列操作和出队列操作就是这样!下面我们开始吧

初始化队列机构

在使用顺序队列之前,首先要创建一个空的顺序结构,也就是初始化一个队列结构,步骤如下:
1.按符号常量QUEUELEN指定的大小申请一片内存空间,用来保存队列中的数据.
2.设置head=0,和tail=0,表示一个空栈.
代码如下:

public SQType SQTypeInit(){
    SQType q;
    if((q=new SQType())!=null){                     //申请内存
        q.head = 0;                                 //设置队尾
        q.tail = 0;                                 //设置队尾
        return q;
    }else
    {
        return null;                                 //返回null
    }
}

在上诉代码,使用关键字new申请内存,申请成功后设置队头和队尾,然后返回申请内存的地址.如果申请内存失败,将返回null.

判断空队列

判断空队列即判断一个队列结构是否为空,只需要判断head==tail就可以了.空队列则不能在出队列.

public boolean SQTypeIsEmpty(SQType q){
        if(q!=null){
            return q.head ==q.tail;
        }
        return false;
    }

判断满队列

判断一个队列是否为满,如果满队列,则表示该队列结构中没有多余的空间来保存额外数据,满了就不可以进行入队列操作,而可以进行出队列.

 public boolean SQTypeIsFull(SQType q){
        if(q!=null){
            return q.tail == QUEUELEN;
        }
        return false;
    }

清空队列

清空一个队列中所有的数据.

 public void SQTypeClear(SQType q){
        if(q!=null){
            q.head = 0;
            q.tail = 0;
        }
    }

释放空间

释放空间及释放队列结构所占用的内存单元.

public void SQTypeFree(SQType q){
        if(q!=null){
            q = null;
        }
    }

入队列

入队列是队列结构的基本操作.主要是把数据保存到队列结构中,步骤如下:
1.首先判断队列是否满了,如果队列满了,就算了
2.把当前数据元素指向现在的队尾tail
3.把tail=tail+1 ,向后移动一个位置.

 public boolean SQTypeInsert(SQType q,DATA4 data){
        if(!SQTypeIsFull(q)){                                        //判断队列是否满了
            q.data[q.tail++] = data;                                 //先入队列,后位置向后移动
            return true;                                             //入队列成功
        }
        return false;                                                //入队列失败
    }

出队列

出队列是队列结构的基本操作,主要把数据从队列结构中队头的位置推出来,步骤如下:
1.判断队列head,如果head等于tail,等表示为空队列.
2.从队列首部取出队头元素(实际是返回队头元素的引用)
3.设修改头head的序号,使其指向后一个元素.

  public DATA4 SQTypeOut(SQType q){

        if(!SQTypeIsEmpty(q)){                                      //判断队列是否为空
           return q.data[q.head++];                                 //从队列取出数据,并且head指向下一个元素
        }
        return null;
    }

读取结构数据

读结点数据的操作仅显示队列顶结点数据的内容,而出队列操作则将队顶数据弹出,该数据就不再不存在了.

 public DATA4 SQTypePeek(SQType q){
        if(!SQTypeIsEmpty(q)){                                       //判断队列是否为空
            return q.data[q.head];                                   //从队列取出数据
        }
        return null;
    }

计算队列长度

获取队列结构中结点的数据的个数.

 public int SQTypeInt(SQType q){
        int len = 0;
        if(q!=null){
            len = q.tail-q.head;
        }
        return len;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容