`
Liang_Hong
  • 浏览: 6431 次
社区版块
存档分类
最新评论

Java学习之,总结乎——顺序队列

 
阅读更多

深感学习一个知识点,不能囫囵吞枣。

首先得对一个概念有正确(开始不一定正确,但至少得头脑清晰)的认知,再尝试按照自己的理解去练习写代码,这样才能真的学到东西。

队列是一种特殊的线性表,特殊之处在于限制了存取点,意思就是插入操作在队头进行,删除操作在队尾进行,分别称之为入队、出队。

由于插入和删除操作分别在队尾和队头进行,最先入队的元素总是最先出队,因此队列也称为先进先出(First In First Out)表。

 

以下是从顺序队列到顺序循环队列的代码展示:

/**
 * 顺序队列
 * 当队列为空时,设置队头、队尾下标为0
 * @author Administrator
 *
 */
public class SeqQueue1 {
	private Object value[];
	private int front,rear,size;
	
	public SeqQueue1(int capacity){
		this.value=new Object[Math.abs(capacity)];
		this.front=this.rear=0;
	}
	
	public SeqQueue1(){
		this(1);
	}
	
	//判断是否队空,若空返回true
	public boolean isEmpty(){
		return this.size==0;
	}
	
	//判段队列是否已满,若满返回true
	public boolean isFull(){
		return this.size==this.value.length;
	}
	
	//在队尾添加元素
	public void enQueue(Object obj){
		if(isFull()){
			Object temp[]=new Object[this.value.length+1];
			for(int i=0;i<this.value.length;i++){
				temp[i]=this.value[i];
			}
			this.value=temp;
			temp=null;
		}
		this.rear=(this.front+this.size)%this.value.length;
//		this.rear++;
		this.value[rear]=obj;
		this.size++;
	}
	
	//队头元素出列
	public Object deQueue(){
		if(isEmpty())
			throw new RuntimeException("队列为空!");
		Object obj=this.value[this.front];
		this.front=(this.front+1)%this.value.length;
//		this.front++;
		this.size--;
		return obj;
	}
	
	//返回队列中元素个数
	public int size(){
		return this.size;
	}
}

 

/**
 * 测试类
 * @author Administrator
 *
 */
public class StuTest1 {
	
	private String name;
	private int score;
	
	public String getName() {
		return name;
	}

	public int getScore() {
		return score;
	}
	public StuTest1(String name,int score){
		this.name=name;
		this.score=score;
	}
	public static void main(String[] args) {
		SeqQueue1 seq1=new SeqQueue1();
		StuTest1 st1=new StuTest1("张三",4);
		StuTest1 st2=new StuTest1("李四",5);
		StuTest1 st3=new StuTest1("王五",6);
		StuTest1 st4=new StuTest1("赵六",7);
		
		seq1.enQueue(st1);
		seq1.enQueue(st2);
		seq1.enQueue(st3);
		seq1.enQueue(st4);
		
		System.out.println(seq1.size());
		//循环里不能直接用i<seq.size(),因为每出来一个元素,seq.size()值减1
		int num=seq1.size();
			for(int i=0;i<num;i++){
				StuTest1 st=(StuTest1)seq1.deQueue();
				System.out.println("姓名为:"+st.getName()+",学分为:"+st.getScore());
			}
		}

}

 顺序队列缺点分析:

(1)存在数组下标假溢出,就是队列可能没满,但是却不能再往里面添加元素

(2)一次入队/出队操作可能需要同时改变两个下标

 

为了克服以上不足,可以将顺序队列构造成一个逻辑上首尾相连的循环队列。

/**
 * 顺序循环队列
 * @author Administrator
 *
 */
public class SeqQueue2 {
	private Object value[];
	private int size,front,rear;
	
	//构造指定容量的空队列
	public SeqQueue2(int capacity){
		this.value=new Object[Math.abs(capacity)];
		this.front=this.rear=0;
	}
	
	//构造默认容量的空队列
	public SeqQueue2(){
		this(1);
	}
	
	//判断队列是否为空,若空返回true
	public boolean isEmpty(){
		return this.front==this.rear;
	}
	
	//在队尾添加元素
	public boolean enQueue(Object obj){
		if(this.front==(this.rear+1)%this.value.length){
			Object temp[]=this.value;
			this.value=new Object[temp.length+1];
			int i=this.front,j=0;
			while(i!=this.rear){
				this.value[j]=temp[j];
				i=(i+1)%temp.length;
				j++;
			}
			this.front=0;
			this.rear=j;
		}
		this.value[this.rear]=obj;
		this.rear=(this.rear+1)%this.value.length;
		this.size++;
		return true;
	}
	
	//队头元素出队
	public Object deQueue(){
		if(isEmpty())
			throw new RuntimeException("队列已空!");
		else{
			Object obj=this.value[this.front];
			this.front=(this.front+1)%this.value.length;
			this.size--;
			return obj;
		}
	}
	
	//返回队中元素个数
	public int size(){
		return this.size;
	}
}

 

/**
 * 测试类
 * @author Administrator
 *
 */
public class StuTest2 {
	private String name;
	private int score;
	public String getName() {
		return name;
	}
	public int getScore() {
		return score;
	}
	public StuTest2(String name,int score){
		this.name=name;
		this.score=score;
	}
	public static void main(String[] args) {
		SeqQueue2 seq2=new SeqQueue2();
		StuTest2 st1=new StuTest2("张三",4);
		StuTest2 st2=new StuTest2("李四",5);
		StuTest2 st3=new StuTest2("王五",6);
		StuTest2 st4=new StuTest2("赵六",7);
		
		seq2.enQueue(st1);
		seq2.enQueue(st2);
		seq2.enQueue(st3);
		seq2.enQueue(st4);
		
		//循环里不能直接用i<seq.size(),因为每出来一个元素,seq.size()值减1
		int num=seq2.size();
		for(int i=0;i<num;i++){
			StuTest2 st=(StuTest2)seq2.deQueue();
			System.out.println("姓名为:"+st.getName()+",学分为:"+st.getScore());
		}
	}

}

 

分享到:
评论

相关推荐

    操作系统——磁盘调度算法【java实现】

    用java实现的四种磁盘调度算法:fcfs sstf scan cscan 。 可以随机生产磁道号,也可以自己指定。然后用表格的形式呈现出四种算法的磁道访问序列。欢迎下载。

    队列操作的验证及应用

    掌握顺序循环队列的表示与实现。 3、实验内容: 设有N个人站成一排,从左到右的编号分别为1——N,现在从左往右报数“1,2,3,1,2,3。。。”,数到1的人出列,数到2和3的人立即站到队伍的最右端。报数过程反复...

    数据结构&amp;算法——Java.zip

    逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何...

    Java JDK实例宝典

    全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...

    java初学者必看

    最近正在学习Java,也买了很多的有关Java方面的书籍,其中发现《跟我学Java》这本书,都的很不错啊,所以顺便拿电脑把这本书的目录敲了下来,与大家分享。尤其是那些和我一样初学Java的朋友们,看看哪一节对你有用,...

    RR.rar_1-wire_RR_rr java_时间片 java_轮转调度

    (3) 把5个进程按顺序排成循环队列,用指针指出队列连接情况。用一个标志单元记录轮到运行的进程。处理器调度总是选择标志单元指示的进程运行,对所指的进程,将其“已运行时间”加1。 (4) 进程运行一次后,若“要求...

    Java开发技术大全 电子版

    Java开发技术大全 电子版 第1篇Java基础知识入门. 第1章Java的开发运行环境2 1.1Java的运行环境与虚拟机2 1.2Java的开发环境4 1.2.1JDK的安装4 1.2.2如何设置系统环境变量6 1.2.3编译命令的使用8 1.2.4解释...

    数据结构与算法分析_Java语言描述(第2版)]

    中文名: 数据结构与算法分析_Java语言描述(第2版)作者: 韦斯译者: 冯舜玺资源格式: PDF版本: 扫描版出版社: 机械工业出版社书号: ISBN:9787111231837发行时间: 2009年01月01日地区: 大陆语言: 简体中文简介: 内容...

    数据结构与算法分析Java语言描述(第二版)

    目录译者序前言第1章 引论1.1 本书讨论的内容1.2 数学知识复习1.2.1 指数1.2.2 对数1.2.3 级数1.2.4 模运算1.2.5 证明的方法1.3 递归简论1.4 实现泛型特性构件pre-Java51.4.1 使用Object表示泛型1.4.2 基本...

    算法和数据结构——左程云.zip

    逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何...

    数据结构与算法分析 Java语言描述第2版

    中文名: 数据结构与算法分析_Java语言描述(第2版)作者: 韦斯译者: 冯舜玺图书分类: 软件资源格式: PDF版本: 扫描版出版社: 机械工业出版社书号: ISBN:9787111231837发行时间: 2009年01月01日地区: 大陆语言: 简体...

    数据结构与算法分析_Java语言描述(第2版)

    中文名: 数据结构与算法分析_Java语言描述(第2版) 作者: 韦斯 译者: 冯舜玺 图书分类: 软件 资源格式: PDF 版本: 扫描版 出版社: 机械工业出版社 书号: ISBN:9787111231837 发行时间: 2009年01月01日 地区: 大陆 ...

    asp.net知识库

    动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个时间转换的问题,顺便谈谈搜索技巧 .net中的正则表达式使用高级技巧 (一) C#静态成员和...

    程序员代码面试指南——IT名企算法和数据结构题目最优解.zip

    逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何...

    数据结构与算法分析-Java语言描述(第2版)_2_2

    6.4.2 事件模拟 6.5 d-堆 6.6 左式堆 6.6.1 左式堆性质 6.6.2 左式堆操作 6.7 斜堆 6.8 二项队列 6.8.1 二项队列结构 6.8.2 二项队列操作 6.8.3 二项队列的实现 6.9 标准库中的优先队列 小...

    数据结构与算法分析-Java语言描述(第2版)_1_2

    6.4.2 事件模拟 6.5 d-堆 6.6 左式堆 6.6.1 左式堆性质 6.6.2 左式堆操作 6.7 斜堆 6.8 二项队列 6.8.1 二项队列结构 6.8.2 二项队列操作 6.8.3 二项队列的实现 6.9 标准库中的优先队列 小...

    leetcodepushfront-staywoke:一个致力于对编程问题保持新鲜的回购

    leetcode 推前保持清醒 这个 repo 致力于让我们对编程问题保持清醒。 这些将包括许多编程概念,例如字符串操作、循环、递归和数据结构。...pop()——从队列前面移除元素。 peek() -- 获取最前面的元素。 empty() -- 返

    javaSE代码实例

    第2章 基本数据类型——构建Java 大厦的基础 12 2.1 源代码注释 12 2.1.1 单行注释 12 2.1.2 区域注释 12 2.1.3 文档注释 13 2.2 基本数据类型 14 2.2.1 整型 15 2.2.2 浮点型 17 2.2.3 char型 17...

    基于spark-streaming框架的实时计算系统源码+项目说明.zip

    1.项目代码均经过功能验证ok,确保稳定可靠运行。...解决从Kafka中消费数据时的漏消费、重复消费以及读取数据时的顺序问题。 publisher-realtime——数据可视化模块 sparkStreaming-realtime——实时计算模块

Global site tag (gtag.js) - Google Analytics