java队列

来源:互联网 发布:知乎 中国出生率 编辑:程序博客网 时间:2024/06/05 15:32

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

每次在队尾插入一个元素是,rear增1;删除一个元素时front增一。

队列可以划分为顺序队列,循环队列

顺序队列就是建立顺序队列结构必须为其静态分配或动态申请一片连续的存储空间,不过顺序队列有个致命的缺陷就是尾指针和头指针都会不断增长造成空间的大量冗余(就好比用数组来存,指针不断后移,不回头那种,就会造成前面的空间浪费)

循环队列就是把数组看成一个环形(FBI WARNING 此方法很6),在实际使用队列时,为了使队列空间能重复使用,往往对队列的使用方法稍加改进:无论插入或删除,一旦rear指针增1或front指针增1 时超出了所分配的队列空间,就让它指向这片连续空间的起始位置。自己真从MaxSize-1增1变到0,可用取余运算rear%MaxSize和front%MaxSize来实现。这实际上是把队列空间想象成一个环形空间,环形空间中的存储单元循环使用,用这种方法管理的队列也就称为循环队列。除了一些简单应用之外,真正实用的队列是循环队列,在循环队列中,当队列为空时,有front=rear,而当所有队列空间全占满时,也有front=rear。为了区别这两种情况,规定循环队列最多只能有MaxSize-1个队列元素,当循环队列中只剩下一个空存储单元时,队列就已经满了。因此,队列判空的条件时front=rear,而队列判满的条件时front=(rear+1)%MaxSize。


这一步关键在于理解(rear+1)%MaxSize这个思维,这个思维的关键在于是谁追上谁,所以数组中只允许存储最大长度-1个数据。


package Queue;

public class QueueTest {
    private int array[]=null;
    
    private int head;
    private int tail;
    
    private int maxLen;
    
    public QueueTest() {
        // TODO Auto-generated constructor stub
        this(10);
    }
    
    public QueueTest(int len)
    {
        array=new int[len];
        head=0;
        tail=0;
        maxLen=array.length;
    }
    
    void add(int data)
    {
        if(isFull())
        {
        System.out.println("Queue full");
        }
        else
        {
            array[tail]=data;
            tail=(tail+1)%maxLen;
            
        }
            
    }
    
    void delete()
    {
        if(isNull())
        {
            System.out.println("isNull");
        }
        else
        {
            
            array[head]=0;
            head=(head+1)%maxLen;
            
        }
    }
    
    void display()
    {
        
        for(int i=0;i<3;i++)
        {
            
            System.out.println(array[i]+"head:"+head+"tail"+tail);
        }
    }
    
    Boolean isFull()
    {
        if((tail+1)%maxLen ==head)
        {
            return true;
        }
        
        return false;
        
    }
    
    Boolean isNull()
    {
        if(head==tail)
        {
            return true;
        }
        
        return false;
        
    }
    
    public static void main(String[] args) {
        QueueTest qt = new QueueTest(3);
        qt.add(5);
        qt.add(10);
        qt.delete();
        qt.add(10);
        qt.add(10);
        qt.delete();
        qt.add(3);
        qt.add(2);
        qt.delete();
        qt.add(2);

        qt.display();
        
        System.exit(0);
    }
    
    

}



原创粉丝点击