队列存储音频数据_程序员:数据结构与算法,队列的顺序存储结构

什么是队列

像栈一样,队列(queue)也是表。

使用队列插入在一端进行删除则在另一端进行。

比如说键盘进行字母或数字的输入,到显示器上如记事本上输出,其实这就是队列的应用。

队列是只允许在一端进行插入操作,而在另一端删除的线性表。

队列是一种先进先出的线性表,简称FIFO

允许插入的一端是队尾,允许删除的一端是队头。

队列的基本操作是enqueue(人队),它是在表的末端(叫作队尾( rear))插入一个元素,和

dequeue(出队),它是删除(并返回)在表的开头(叫作队头( front))的元素。下图显示一个队列的

抽象模型。

6f35faca1f0c2eebb1d600339b4b7bf5.png

队列接口Queue的定义:

+int getSize() 获取队列中的元素+boolean isEmpty() 判断队列是否为空+void enqueue() 从队头添加一个元素+E dequeue() 从队尾删除一个元素+E getFront() 获取队头元素+E getRear() 获取队尾元素+E clear() 清空队列
package DS01.动态数组;public interface Queue extends Iterable{    //获取队列中元素的个数    int getSize();    //判断队列是否为空    boolean isEmpty();    //入队一个元素    void enqueue(E e);    //出队一个元素    E dequeue();    //获取队头    E getFront();    //获取队尾    E getRear();    //清空队列    void clear();}

队列的顺序存储结构ArrayQueue的定义:

f60d6bfa457390d16636bf5f4ba2c566.png

队列的顺序存储结构——入队操作

Front和Rear一开始都指向队头的前面,此时队列为空,当进入元素是,Front不动,Rear跟随进入的元素进行++。即队尾进入元素。

51f0dfbd8aa2d13d217f9bc762c2ec3f.gif

队列的顺序存储结构——出队操作

从队头开始删除元素,每删除一个元素,后面的元素都向前移动,然后Front不动,Rear–。

40fefb8d9f97873a61a9d932d4f4c422.gif

队列顺序存储结构的弊端

队列的顺序存储结构本身是由ArrayList实现的

在数据元素入队的时候,相当于在ArrayList表尾添加元素

在数据元素出队的时候,相当于在ArrayList表头删除元素

很明显,入队的时间复杂度0(1).出队的时间复杂度0(n) .

线性表增删数据元素时间复杂符都是O(),但是这个是按平均算的

队列的出队时间复杂度O(),可不是按平均算的,因为每次出队都是0(n)

队列的代码:

package DS01.动态数组;/*队列的顺序存储结构*/import java.util.Iterator;public class ArrayQueue implements Queue {//定义线性表对象list    private ArrayList list;//默认无参构造函数    public ArrayQueue(){        list=new ArrayList<>();    }//    @Override    public int getSize() {        return list.getSize();    }    @Override    public boolean isEmpty() {        return list.isEmpty();    }    @Override    public void enqueue(E e) {        list.addLast(e);    }    @Override    public E dequeue() {        return list.removeFirst();    }    @Override    public E getFront() {        return list.getFirst();    }    @Override    public E getRear() {        return list.getLast();    }    @Override    public void clear() {        list.clear();    }    @Override    public Iterator iterator() {        return list.iterator();    }//使用toSting返回数组的格式    @Override    public String toString() {        StringBuilder sb=new StringBuilder();        sb.append(String.format("ArrayQueue: %d/%d",getSize(),list.getCapacity()));        sb.append('[');        if(isEmpty()){            sb.append(']');        }else{            for(int i=0;i
实现代码:
package DS01.动态数组;public class TestArrayQueue {    public static void main(String[] args) {        ArrayQueue queue=new ArrayQueue<>();        for(int i=1;i<=15;i++){            queue.enqueue(i);        }        System.out.println(queue);        for(int i=1;i<=10;i++){            queue.dequeue();        }        System.out.println(queue);    }}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值