类似队列的java实现

实现了栈后,索性又实现以下队列。本文主要介绍队列的定义、队列的java实现和队列的作用。

队列的定义

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

队列的实现

这里说一下,我这实现的和队列的定义其实不符合,只是遵从了先进先出的思想。为了防止出现“假溢出”的问题,每次删除元素都添加了一个动作:将所有元素前移一位,这样对头始终在数组的开始。基本思想和栈的实现一样,用一个字符串数组作为队列的容器,数组的第一个元素为队列头部,并用一个int值作为队列的尾部指针。当插入队列的时候,直接将值放入数组的相应位置; 删除队列元素的时候,用到System.arraycopy()这个方法将除了队列头部的数据向前移动一位。注意这个过程中的队列尾部指针的变化。

/**
 *基于String数组的队列,数组第一个为队头,插**入的字符依次加入数组
 */
public class Queue{
    /*
     *队列容器数组
     */
    private String[] queueStr;
    /*
     *队尾指针
     */
    private int rear;
    /*
     *队列容器数组的长度
     */
    private int length = 0;

    public Queue(){
        this.rear = -1;
        this.length = 100;
        queueStr = new String[length];
    }
    public Queue(int length){
        this.rear = -1;
        this.length = length;
        queueStr = new String[length];
    }

    public void push(String s){
        if(rear < queueStr.length - 1){
            queueStr[++rear] = s;
        }else{
            print("error!\n");
        }
    }

    public String pop(){
        if(rear >= 0) {
            String s = queueStr[0];
            System.arraycopy(queueStr,1,queueStr,0,rear + 1);
            rear--;
            return s;
        }else{
            print("pop error!");
            return null;
        }
    }

    public String toString(){
        String s = "";
        for(int i = 0; i <= rear; i++){
            s += queueStr[i] + " ";
        }
        return s;
    }

    private void print(String s){
        System.out.print(s);
    }
}

其实实现队列的主要难度是删除操作。因为为了避免“假溢出”,考虑移位,我去看了arraylist的实现,发现其remove方法使用了“System.arraycopy()”这个方法,就搬到这个程序来了!就是提醒一下自己,要多看这些大牛的源码!

队列的用途

队列和显示中的排队类似,经常用来模拟排队。看看后续写一个模拟程序吧。^_^

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java中,可以使用消息队列实现对数据的监听。常见的消息队列系统包括ActiveMQ、RabbitMQ和Kafka等。 下面以RabbitMQ为例,介绍如何在Java中监听队列数据: 1. 首先,确保已经安装并启动了RabbitMQ服务。 2. 使用RabbitMQ的Java客户端库,例如amqp-client,将其添加到项目的依赖中。 3. 创建一个连接到RabbitMQ服务器的连接工厂对象,并设置连接参数,例如主机名、端口、用户名和密码等。 ```java ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); // RabbitMQ服务器主机名 factory.setPort(5672); // RabbitMQ服务器端口号 factory.setUsername("guest"); // RabbitMQ用户名 factory.setPassword("guest"); // RabbitMQ密码 ``` 4. 使用连接工厂创建一个连接对象,并通过连接对象创建一个信道(Channel)对象。 ```java Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); ``` 5. 声明一个队列,并将信道绑定到该队列。 ```java String queueName = "my_queue"; channel.queueDeclare(queueName, false, false, false, null); ``` 6. 创建一个消费者对象,并实现Consumer接口的回调方法。 ```java Consumer consumer = new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String message = new String(body, "UTF-8"); System.out.println("Received message: " + message); // 处理接收到的消息 } }; ``` 7. 使用消费者对象订阅队列。 ```java channel.basicConsume(queueName, true, consumer); ``` 8. 程序运行后,消费者对象会一直监听队列,并在有新消息到达时触发回调方法进行处理。 以上是一个简单的示例,你可以根据实际需求进行更复杂的处理和配置。同时,其他消息队列系统的使用方式也类似,只是具体的API和配置可能会有所不同。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值