zoukankan      html  css  js  c++  java
  • 线性表之队列操作

      1 package cn.njupt.mdj.queue;
      2 
      3 
      4 /*
      5  * 好好理解思路,才是最重要的,画图可以帮助理解!
      6  * 
      7  */
      8 
      9 //定义好一个队列的结构,此种队列采用的是this.tail=-1;完成的,也可以用this.tail=0;完成
     10 class Queue{
     11     //首先定义队列的大小,默认大小
     12     private int maxSize = 10;
     13     //为了能够储存任何元素 ,所以采用Object
     14     private Object[] data;
     15     //队列的头
     16     private int head;
     17     //队列的尾
     18     private int tail;
     19     //统计元素的个数
     20     private int count;
     21     
     22     //初始化队列
     23     public Queue(int size){
     24         this.maxSize = size;
     25         this.data = new Object[maxSize];
     26         this.head = 0;
     27         //这里为-1,是因为,向队尾添加元素后,队尾会+1,所以就指向了一个元素的位置,所以是要前置++;即++this.tail,而不是this.tail++
     28         //如果是this.tail++,则会在-1的数组中添加元素,那么就数组越界了,所以明白原理是非常重要的,那么就需要是this.tail=0;来初始化了。
     29         this.tail = -1;
     30         this.count = 0;
     31     }
     32     
     33     //添加元素,即向队列中增加元素,
     34     public void insert(Object data){
     35         //添加元素之前,首先要判断的是队列中是否还有空间来储存元素,所以首先判读队列是否已满
     36         if(ifFull()){
     37             return;
     38         }
     39         //如果没有满,即可以填加元素,但是另外需要注意的如果队尾已经到达了数组的顶部,那么为了下次添加元素,那么
     40         //tail队尾,应该回到第一元素之前的位置,即复原。
     41         if(this.tail == maxSize-1){//注意是maxSize-1; 而不是maxSize ,因为this.tail是++this.tail
     42             //因为此时的this.tail所指向的单元中已经存放了元素了
     43             this.tail = -1;
     44         }
     45         //否则即未满,也没有到达数组尾部则正常添加
     46         this.data[++this.tail] = data;
     47         //同时元素个数+1;
     48         this.count++;
     49         
     50     }
     51     
     52     //判读元素是否满了
     53     public boolean ifFull(){
     54         //当this.count 元素个数 增加到 和 元素储存空间一致的时候,即满了。
     55         return this.count == this.maxSize;
     56     }
     57     
     58     //可以添加当然就可以删除元素,所以删除元素,并返回删除的元素
     59     public Object remove(){
     60         if(isEmpty()){//如果元素没有了,即返回null
     61             return null;
     62         }
     63         
     64         Object temp = this.data[this.head++];//head++;先取元素,然后在向后移动
     65         //删除元素,同样如果删除的话,如果删除的head的指针到了数组顶部,那么也要还原
     66         if(this.head == maxSize){//因为是先放后++,所以当this.head元素取走后,然后++,就到到达了末尾
     67             this.head =0;
     68         }
     69         this.count--;
     70         return temp;
     71     }
     72     
     73     //判断元素是否为空
     74     public boolean isEmpty(){
     75         return this.count == 0;
     76     }
     77     
     78     //获取元素个数
     79     public int getSize(){
     80         return this.count;
     81     }
     82     
     83     //获取head的元素
     84     public Object peekHead(){
     85         return this.data[this.head];
     86     }
     87     
     88     public String toString(){
     89         if(isEmpty()){
     90             return "[]";
     91         }else{
     92             StringBuffer s = new StringBuffer();
     93             s.append("[");
     94             for(int i=this.head;i<this.tail;i++){
     95                 s.append(this.data[i]+",");
     96             }
     97             s.append("]");
     98             return s.toString();
     99         }
    100         
    101     }
    102     
    103 }
    104 
    105 /*
    106  * 注:当如果初始化,采用的是this.head =0 和 this.tail=0 完成,则
    107  */
    108 class Queue2{
    109     private int maxSize;
    110     private Object[] data;
    111     private int head;
    112     private int tail;
    113     
    114     public Queue2(int size){
    115         this.maxSize = size;
    116         this.data = new Object[this.maxSize];
    117         //开始初始化
    118         this.head = 0;
    119         this.tail = 0;
    120     }
    121     
    122     public void insert(Object data){
    123         //增加元素,首先要判断元素是否已满了。
    124         if(isFull()){
    125             return;
    126         }
    127         //元素为满,但如果尾指针已经到了最后一个元素,即最后一个元素已经存放了元素
    128         if(this.tail == maxSize){
    129             //只有当this.tail==maxSize,那么说maxSize-1 处存放了元素了。
    130             //回原
    131             this.tail = 0;
    132         }
    133         //没有,则继续添加元素
    134         this.data[this.tail++] = data;
    135         
    136     }
    137     
    138     public boolean isFull(){
    139         //原因为,采用this.head++ this.tail++; 这样每当添加一个元素的时候是,先放元素,然后在加+1,即指向空处
    140         //如:this.head=0,this.tail=0;,添加一个元素后,this.head=0;不变,this.tail++;则先
    141         //把元素放在了0处,然后+1;即this.tail=1; 那么 1-0 = 1 元素
    142         int size = (this.tail-this.head);
    143         return size == this.maxSize;
    144     }
    145     
    146     //删除元素
    147     public Object remove(){
    148         //首先判读是否为空
    149         if(isEmpty()){
    150             return null;
    151         }
    152         Object temp = this.data[this.head++];//取出元素
    153         if(this.head == maxSize){//则最后一个元素也取出来了,还原
    154             this.head = 0;
    155         }
    156         return temp;
    157     }
    158     
    159     public boolean isEmpty(){
    160         //要判断为空与否,从开始看 this.tail = 0 = this.head  即为空,
    161         //当添加元素后 this.tail++ -->先存放后加
    162         //删除元素的时候 this.head++ -->先删除,在加
    163         //画图可以看出,只要当两个相同的时候即为空
    164         return this.head == this.tail;
    165     }
    166     
    167     //获取元素个数
    168     public int getSize(){
    169         return this.tail-this.head;
    170     }
    171     
    172     //获取head的元素
    173     public Object peekHead(){
    174         return this.data[this.head];
    175     }
    176     
    177     public String toString(){
    178         if(isEmpty()){
    179             return "[]";
    180         }else{
    181             StringBuffer s = new StringBuffer();
    182             s.append("[");
    183             for(int i=this.head;i<this.tail;i++){
    184                 s.append(this.data[i]+",");
    185             }
    186             s.append("]");
    187             return s.toString();
    188         }
    189         
    190     }
    191 }
    192 
    193 
    194 public class QueueDemo {
    195 
    196     /**
    197      * @param args
    198      */
    199     public static void main(String[] args) {
    200         // TODO Auto-generated method stub
    201         Queue2 q = new Queue2(10);
    202         q.insert("1");
    203         q.insert("2");
    204         q.insert("3");
    205         q.insert("4");
    206         q.insert("5");
    207         q.insert("6");
    208         System.out.println("删除的元素是:"+q.remove());
    209         System.out.println("获取头元素:"+q.peekHead());
    210         System.out.println(q.toString());
    211     }
    212 
    213 }


    参考文章:http://zengzhaoshuai.iteye.com/blog/1171716

    1.队列的顺序存储结构及实现

    2.循环队列(顺序结构存储实现)
    3.队列的链式存储结构及实现
  • 相关阅读:
    Caffe proto閱讀
    C++ 基本知識回顧
    Caffe 源碼閱讀(二) SyncedMemory.hpp
    Caffe 源碼閱讀(一) Blob.hpp
    Matlab
    python
    MxNet下训练alexnet(一)
    服务器自己用户名下编译gcc
    Using python to process Big Data
    23 October
  • 原文地址:https://www.cnblogs.com/pony1223/p/2634441.html
Copyright © 2011-2022 走看看