数据结构——队列的使用

原创 2016年08月30日 23:33:30

       队列(Quene)是一种数据结构,与栈不同的是先进先出(FIFO),最先进去的数据最先出来,而栈是一种(LIFO)。quene结构在现实生活中很常见,例如可以用Quene模拟人们在银行里排队,打印机打印文件,飞机等待起飞,互联网上数据包的发送等。

      与stack一样,Quene也有一套自己的操作。插入队列(add、insert),删除(remove、delete)等。Quene有一个tail与head。通常情况add操作是在tail后面添加元素或者数据,而remove操作是在head(队列的头部进行删除数据)。通常Quene有Peek(查看)、add、remove操作。在add数据之前需要提前判断Quene isFull,在remove数据之前需要判断Quene isEmpty。这些都是保证Quene操作安全稳定的措施。

循环队列与缓冲环

      当向队列中不断从对尾(tail)添加数据时,tail指针不断上移(可以理解为向地址增大的方向的移动)。如果队列空间开辟很小,那么添加较少数数据tail指针就到了顶端。之后若是不及时优化处理就会使队列效率很低。因此采用循环队列或者缓冲环能够解决这一问题,缓冲环不仅在应用层使用广泛,特别是通信或者数据传输时使用方便。

这里写图片描述

环绕式处理

      为了避免队列不满却不能插入新数据的问题,可以让tail指针绕回到数组开始的位置。当删除数据项时可以让对头指针head也进行回绕,但是这样一来可能会形成“队列序列折断”现象。不过再继续下去就会恢复到head指针在tail指针下面的情况。在程序设计中表现为:在add数据项之前进行判断isFull,若true则可以使tail=-1;(回到初始状态),删除数据项之前判断isEmpty,若true则可以使head=0。

class QueneDemo
{
    private int n;
    private int nItem=0;
    private int head=0;
    private int tail=-1;
    int[] value=null;
    public QueneDemo(int n)
    {
        value=new int[n];
        this.n=n;
    }
    public void add(int data)
    {
        if(tail==n-1)
        {
            tail=-1;
        }
        value[++tail]=data;
        nItem++;
    }
    public int remove()
    {
        int temp=value[head++];
        if(head==n)
        {
            head=0;
        }
        nItem--;
        return temp;

    }
    public boolean isEmpty()
    {
        return (nItem==0);

    }
    public boolean isFull()
    {
        return (nItem==n);
    }
    public void peek()
    {
        System.out.println(value[head]); 
    }
}

测试类:

public class QueneApp {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        QueneDemo quene=new QueneDemo(5);
        quene.add(10);
        quene.add(20);
        quene.add(30);
        quene.add(40);
        quene.remove();
        quene.remove();
        quene.remove();
        quene.add(70);
        quene.add(80);
        quene.add(90);
        quene.add(80);
       // quene.peek();
        while(!quene.isEmpty())
        {
            int k=quene.remove();
            System.out.println(k);
        }
    }

}

测试结果:

40
70
80
90
80

结果分析

      创建一个长度为5的队列以后向队列添加4个数据项,再从队列head开始删除3个数据,head指针后移三个数据项,再向队列添加了4个数据项,此时已经出现了指针回绕现象,tail指针回到了队列初始位置(tail=-1)。最后输出队列中的数据,在输出队列数据使用remove方法,会出现head指针回到队列初始状态(head=0,head指针回绕),最终队列里面一次从上到存放着数据项是:70、40、80、90 、80,符合先进先出的结构特征。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

【数据结构】队列的典型应用

在日常生活和计算中,队列的应用也特别的广泛。 比如分解质因数问题

(三)实际项目中数据结构—队列的应用

1.队列:一种数据结构,有非阻塞对列和阻塞对列 特点:先进先出 两种典型操作:队尾添加、队头删除 非阻塞对列:当对列满或空时进行插入或者读取删除操作,抛出异常或者返回false,不对当前线程阻塞,没有...

数据结构_实验3:队列的应用

题目:链式队列的基本操作 将从键盘输入的一系列字符存储到链式队列中,当输入的字符为’0’时,执行出队操作并将出队元素打印到屏幕上;当输入的字符为’@’时,队列中剩余所有元素依次出队并打印到屏幕上;当...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

数据结构—队列

数据结构—队列 1、队列的定义 队列(Queue)也是一种运算受限的线性表,它的运算限制与栈不同,是两头都有限制,插入只能在表的一端进行(只进不出),而删除只能在表的另一端进行(只出不进),允许插入...

【数据结构】(面试题)使用两个栈实现一个队列(详细介绍)

使用两个栈实现一个队列思路一:我们设定s1是入栈的,s2是出栈的。入队列,直接压到s1即可出队列,先把s1中的元素倒入到s2中,弹出s2中的栈顶元素;再把s2的剩余元素全部倒回s1中。650) thi...

使用两个队列实现一个栈

队列是先进先出,而栈是先进后出;考虑到我们取栈顶元素的便利性,我们在实现时使得栈顶等于队列头;由于栈的pop弹出栈顶元素,而队列的pop也是弹出栈顶元素,所以我们需要特别处理的是插入操作。由于往栈中添...

数据结构-队列(queue)

队列(queue)是一种采用先进先出(FIFO)策略的抽象数据结构,它的想法来自于生活中排队的策略。顾客在付款结账的时候,按照到来的先后顺序排队结账,先来的顾客先结账,后来的顾客后结账。队列实现同栈的...

数据结构(三)——队列及实现、循环队列实现

一、队列     队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称...
  • fansongy
  • fansongy
  • 2011年09月17日 17:03
  • 12326

数据结构之队列

栈是“后进先出”(LIFO,Last InFirst Out)的数据结构,与之相反,队列是“先进先出”(FIFO,First InFirst Out)的数据结构 队列的作用就像售票口前的人们站成的一排...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构——队列的使用
举报原因:
原因补充:

(最多只允许输入30个字)