问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

排队服务中的队列有哪几种类型?各有怎样的优缺点?如何改进

发布网友 发布时间:2022-04-25 02:00

我来回答

2个回答

懂视网 时间:2022-04-06 14:10

队列有3种实现方式,实现方式为:

1、基于链表来实现队列:

首先添加一个节点类,作为队列中的节点元素

public class Node {//链表中的一个节点
Node next = null;
int data;
//构造函数,用于添加链表时候使用
public Node(int d) {
this.data = d;
};
}

再新建一个类作为我们的队列,在该类中实现队列的入队和出队以及求队列的长度和判断队列是否为空等方法

①入队操作:

首先通过函数参数传入要入队的数据,根据传入的参数,新增一个节点Node,在入队方法中判断该队列是否为空,若该队列为空(head==tail),则该入队的节点既是队头也是队尾。若队列不为空,则将尾节点tail的next指针指向该元素,然后将tail节点指向该节点。

public void put(Integer data) {
Node newNode = new Node(data);//构造一个新节点
if(head == null && tail == null) {//队列为空
head = newNode;
tail = newNode;
}else {
tail.next = newNode;
tail = newNode;
}
}

②出队操作:

若队列为空,则返回空。若队列不为空,则返回该队列的头结点,然后将头结点的下一个元素重新作为头节点

public Integer pop() {
if(this.isEmpty()) {
return null;
}
int data = head.data;
head = head.next;
return data;
}

③判断队列空和对列长度很简单,直接贴代码,不再多说。

public int size() {
int count = 0;
Node tmp = head;
while(tmp != null) {
count++;
tmp = tmp.next;
}
return count;
}

④详细代码实现:

package com.wp.datastruct;
 
/**
 * 利用链表来实现队列
 * */
public class MyQueue<E> {
Node head = null;//队列头
Node tail = null;//队列尾
/**
* 入队操作:
* 若该队列尾空,则入队节点既是头结点也是尾节点
* 若队列不为空,则先用tail节点的next指针指向该节点
* 然后将tail节点指向该节点
* */
public void put(Integer data) {
Node newNode = new Node(data);//构造一个新节点
if(head == null && tail == null) {//队列为空
head = newNode;
tail = newNode;
}else {
tail.next = newNode;
tail = newNode;
}
}
/**
* 判断队列是否为空:当头结点等于尾节点的时候该队列就为空
* */
public boolean isEmpty() {
return head == tail;
}
/**
* 出队操作:
* 若队列为空,则返回null
* 否则,返回队列的头结点,并将head节点指向下一个
* */
public Integer pop() {
if(this.isEmpty()) {
return null;
}
int data = head.data;
head = head.next;
return data;
}
public int size() {
int count = 0;
Node tmp = head;
while(tmp != null) {
count++;
tmp = tmp.next;
}
return count;
}
 
}

2、使用linkedList来实现队列

该方法是使用java中的linkedList集合来实现一个队列,通过调用linkedList中的方法来实现队列的入队出队,判空等操作

首先new一个类来作为我们的队列,该类中包含两个属性,一个是size:用来统计该队列的长度,另一个是LinkedList对象,

代表我们的队列。

private LinkedList<E> list = new LinkedList<>();
private int size = 0;//用于统计队列的长度

①入队操作:

应为linkedList集合中已经实现好了添加删除操作,在这里我们只需要简单的调用方法就可以实现队列的相关操作了,非常简单而且容易理解。

public synchronized void put(E data) {//保证线程安全,实现同步操作
list.add(data);
size++;
}

②出队操作:

public synchronized E pop() {
size--;
return list.removeFirst();//从头取出
}

③详细代码:

public class MyQueue2<E> {
private LinkedList<E> list = new LinkedList<>();
private int size = 0;//用于统计队列的长度
public synchronized void put(E data) {//保证线程安全,实现同步操作
list.add(data);
size++;
}
public synchronized E pop() {
size--;
return list.removeFirst();//从头取出
}
public synchronized int size() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
}

3、使用两个栈来实现一个队列。

也可以使用两个实现好的栈来实现一个队列(这个问题可能面试笔试的时候回被问到)。

实现方法是:

创建两个栈s1,s2。入队的时候就只压栈到s1中。

出队分两种情况:1.当s2不为空的使用,就弹出栈顶元素作为出队元素。

2.当s2等于空,则先将s1中的元素全部弹出到s2中,再从s2中弹出栈顶元素作为出队元素。

①入队:

public synchronized void put(E data) {//使用同步处理,保证线程安全
s1.push(data);
}

②出队:

public synchronized E pop() {
if(!s2.isEmpty()) {
return s2.pop();
}else {
s2.push(s1.pop());
return s2.pop();
}
}

③.详细代码实现:

package com.wp.datastruct;
 
import java.util.Stack;
 
/**
 * 利用两个栈来模拟队列操作
 * 入队操作就只是想栈s1中添加,
 * 出栈操作分为两部分:
 * 1.当s2中不为空的时候,就直接弹出s2中的栈顶数据
 * 2.当s2中为空的时候,就先把s1中的数据全部弹出到s2中然后将栈顶数据出栈
 * 
 * */
public class MyQueue3<E> {
Stack<E> s1 = new Stack<>();
Stack<E> s2 = new Stack<>();
public synchronized void put(E data) {//使用同步处理,保证线程安全
s1.push(data);
}
public synchronized E pop() {
if(!s2.isEmpty()) {
return s2.pop();
}else {
s2.push(s1.pop());
return s2.pop();
}
}
public synchronized boolean isEmpty() {
return s1.isEmpty() && s2.empty();
}
}

推荐教程:《php视频教程》

热心网友 时间:2022-04-06 11:18

队列有三种类型:

1、前瞻性队列研究

前瞻性队列研究是队列研究的基本形式。研究对象的分组是根据研究对象现时的暴露状况而定的,此时研究的结局还没有出现,需前瞻观察一段时间才能得到。

2、历史性队列研究

研究对象的分组是根据研究开始时研究者已掌握的有关研究对象在过去某个时点的暴露状况的历史资料作出的。

3、双向性队列研究

也称混合性队列研究,即在历史性队列研究的基础上,继续前瞻性观察一段时间,它是将前瞻性队列研究与历史性队列研究结合起来的一种模式。

优点:

1、资料可靠,一般不存在回忆偏倚。

2、可直接获得暴露组和对照组人群的发病或死亡率,可直接计算RR、AR等反映疾病危险强度的指标。

3、由于病因在前,疾病在后,因此检验假设的能力较强,一般可证实病因联系。

4、有助于了解疾病的自然史,有时还可能获得多种预期以外的疾病结局资料,可分析一因多种疾病的关系。

缺点:

1、不适于发病率低疾病的病因研究。

2、容易产生失访偏倚。

3、研究耗费人财物和时间较多。

4、在随访过程中,未知变量引入人群,或人群中已知变量的变化等,都可是结局受到影响,使分析复杂化。

扩展资料:

1、队列研究的基本原理:

队列研究的基本原理是在一个特定人群中选择所需的研究对象,根据目前或过去某个时期是否暴露于某个待研究的危险因素,或其不同的暴露水平而将研究对象分成不同的组。

如暴露组和非暴露组,高剂量暴露组和低剂量暴露组等,随访观察一段时间,检查并登记各组人群待研究的预期结局的发生情况,比较各组结局的发生率,从而评价和检验危险因素与结局的关系。

2、队列研究的基本特点:

属于观察法;设立对照组;由因到果;能确证暴露与结局的因果关系。

参考资料:百度百科-队列研究

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
养胃的药最好的是什么啊 婴儿积食发烧不愿吃药怎么办 板门穴位在哪个部位 手机设置放偷看的方法? 凝结水回收器生产厂家? 个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 呼伦贝尔油玉不绝电子商务有限公司怎么样? 深圳殡仪馆骨灰盒价格、尺寸,有图片吗 绵阳市有什么丰富的自然资源吗? 现在的四川绵阳市代市长是谁 黑檀木骨灰盒价格贵不贵?有图片吗 绵阳著名企业有哪些? 绵阳五中排名第几 四川绵阳中学厉害吗?在全国排名多少? 如何配置三层交换机的呀? 四川的中学排名 木质骨灰盒的对比图? 绵阳巿第十屇青少年书信文化活动 作文 我是做法兰片的,请问有没有需要的? 精品骨灰盒的尺寸是多大?有图片吗 三层交换机上网要如何配置? 绵阳初中排名2021最新排名- 问一问 如何配置三层交换机、路由器? 都2020了为什么还是没人能发明出不会爆炸的煤气? 绵阳初中排名如何? 人暴露在宇宙真空中为什么会爆。。。 中西部10强城市最新公布,其中有哪些信息值得关注? 消息服务和消息队列有何区别 如何使用队列存储服务 domino 如何删除服务器队列 如何应用.NET中的消息队列服务 UDP服务器消息队列如何减少加锁次数 保安队列训练内容都有什么? 排队叫号系统的工作原理是什么? hetui什么意思? 错误信息:服务器处理请求队列已满,请重试!怎么办 服务器要有消息队列吗 exchange邮件服务器队列queue大小有限制吗 rabbitmq消息队列,服务端怎样确认消息成功发送到队列 地铁上“网红脸”小姐姐靠肩睡,男子们表现不同,都欺负老实人,你怎么看? 多线程多进程服务的数据队列处理怎么样解决重复读取的 魔兽世界TBC服务器排队队列位置1时进不去了 地铁黑丝小姐姐走红,大长腿吸睛看到脸后,网友:心动的感觉,你怎么看? rabbitmq消息队列服务端怎样确认消息成功发送到队列中 he&#x223C;&#x223C;&#x223C;tui什么意思 共工是一个怎样的人? 地铁“人民币”老奶奶走红,乘客:感觉很不一样,岁月不败美人,是内在气质还是在外装扮,哪个更胜一筹?