`

数组、链表、队列

 
阅读更多
1、  计算机中的存储方式可以大致分为两类:离散存储、有序存储。
  其中的典型代表为链表和数组。

2、  数组的定义格式: 数据类型【】 数组名=new 数据类型【数组长度】;
                   数据类型【】 数组名={元素表};
                   数据类型 数组名【】={元素表};
  java中的数组为定长,即在定义时必须给定数组的长度。
  由于数组是按顺序存储,所以查找时可以直接根据数组中元素的下标获得所需数据。

3、  链表就像一条隐形的链子,一环扣一环。链表的基本单位是结点,每个结点包括两个部分:该结点中的存储的数据,以及所连接的下个结点。
  链表中数据的查找则必须从头开始,依次通过每个结点获得它所连接的下个结点。
  一个简单链表的实现可以用如下代码

//首先定义一个结点类
  public class Node{
    Object data;
    Node next;
  }
//通过结点的依次添加和连接获得一个链表
    Node n1=new Node();
    n1.data=所附的值;
    Node n2=new Node();
    n2.data=所附的值;
     Node n3=new Node();
    n3.data=所附的值;
     ... ...
    n1.next=n2;
    n2.next=n3;
    ... ...
 
由以上可以看出,如果使用链表直接存储数据,数据的添加过程将是一个非常繁琐的过程。但是使用队列优化后的链表使用起来就可以非常简单。 

4、   队列也是一个存放东西的容器。但队列的使用比数组、链表更加灵活。一个完善的队列可以很方便的实现添加、删除、更改、获得长度、插入、查找等操作。因此通过把数组和链表转化为队列,可以实现对数组和链表的优化,增强其实用性。
 
以下是分别是用链表和数组实现队列的程序

/**
 * 定义一个结点类
 * @author 陈琳
 * @param <E> 泛型标识,便于使用者向链表中传入不同类型的数据
 */
public class ListNode<E> {

	private E data;
	private ListNode<E> next;
	
	/**
	 * 设置结点中所存储的数据
	 * @param e 要存入的数据
	 */
	public void setData(E e){
		this.data=e;
	}
	
	/**
	 * 设置结点所连接的下个结点
	 * @param next 结点所连接的下个结点
	 */
	public void setNext(ListNode next){
		this.next=next;
	}
	
	/**
	 * 获得结点中所存储的数据
	 * @return 结点中所存储的数据
	 */
	public E getData(){
		return data;
	}
	
	/**
	 * 获得结点所连接的下个结点
	 * @return 结点所连接的下个结点
	 */
	public ListNode getNext(){
		return next;
	}
}



/**
 * 定义一个以链表为基础的队列
 * @author 陈琳
 * @param <E>
 */
public class SingleLinkList<E> {

	/**
	 * 用root表示链表上的第一个结点,last表示链表上的最后一个结点
	 */
	ListNode root;
	private ListNode last;
	
	/**
	 * 设置根节点
	 * @param e将根节点设置成的内容
	 */
	public void setRoot(ListNode e){
		root=e;
	}
	
	/**
	 * 向链表中添加元素
	 * @param e添加的元素对象
	 */
	public void add(E e){
		if(root==null){
			root=new ListNode<E>();
			root.setData(e);
			last=root;
		}else{
			ListNode<E> tem=new ListNode<E>();
			tem.setData(e);
			last.setNext(tem);
			last=tem;
		}
	}
	
	/**
	 * 获得链表的长度
	 * @return 链表的长度
	 */
	public int size(){
		if(root!=null) {
			int t=1;
			ListNode<E> tem=root.getNext();
			while(tem!=null){
				tem=tem.getNext();
				t++;
		    }
			return t;
		}
		return 0;
	}
	
	/**
	 * 根据索引值获得结点
	 * @param index 索引值
	 * @return 索引值所对应的结点
	 */
	public ListNode<E> getNode(int index){
		if(this.size()<index||index<0){
			System.out.println("下标越界");
			return null;
		}else{
			ListNode<E> tem=root;
			for(int i=1;i<index;i++){
				tem=tem.getNext();
			}
			return tem;
		}
	}
	
	/**
	 * 由节点中数据的值获得此结点所在的位置
	 * @param e 指定的结点的数据域的值
	 * @return 指定的结点在链表中的额位置
	 */
	public int getIndex(E e){
		ListNode<E> tem=root;
		int i=1;
		for(;i<this.size();i++){
			tem=tem.getNext();
			while(tem.getData().equals(e)){
				break;
			}
		}
		return i;
	}
	
	/**
	 * 在指定位置插入结点
	 * @param index 链表中指定的位置
	 * @param e 插入的结点的数据域的值
	 */
	public void insert(int index,E e){
		ListNode<E> newNode=new ListNode<E>();
		if(index==1){
			newNode.setData(e);
			newNode.setNext(root);
			root=newNode;
		}else{
			ListNode<E> tem=root;
			for(int i=2;i<index;i++){
				tem=tem.getNext();
			}
			newNode.setData(e);
			newNode.setNext(tem.getNext());
			tem.setNext(newNode);
		}
		
	}
	
	/**
	 * 删除指定位置的结点
	 * @param index 指定的位置的索引值
	 */
	public void delete(int index){
		if(index==1) root=root.getNext();
		else{
			ListNode<E> tem=root;
			for(int i=2;i<index;i++){
				tem=tem.getNext();
			}
			tem.setNext(tem.getNext().getNext());
		}
	}
	
	/**
	 * 更改指定位置的结点的值
	 * @param index 指定结点的位置
	 * @param e 结点数据域的值需改为的值
	 */
	public void update(int index,E e){
		ListNode<E> aimNode=this.getNode(index);
		aimNode.setData(e);
	}
	
	/**
	 * 输出链表中各结点数据域的值
	 * @param root 根节点
	 */
	public void printSingleLinkList(ListNode<E> root){
		ListNode<E> tem=root;
		if(tem==null) return;
		System.out.println(tem.getData()+" ");
		tem=tem.getNext();
		printSingleLinkList(tem);
	}
}




/**
 * 定义一个数组转化为的队列
 * @author 陈琳
 */
public class ArrayQueue<E> {
	private int initLength=100;
	private int increaseLength=10;
    static int count=0;
    
    /**
     * 用于传递数组初始长度和每次增加长度的构造器
     * @param initLength 数组初始长度
     * @param increaseLength 每次增加的长度
     */
    public ArrayQueue(int initLength,int increaseLength){
    	this.initLength=initLength;
    	this.increaseLength=increaseLength;
    }
    
    /**
     * 用于传递数组初始长度的构造器
     * @param initLength 数组初始长度
     */
    public ArrayQueue(int initLength){
    	this.initLength=initLength;
    }
    
    /**
     * 不用传递任何数据的构造器
     */
    public ArrayQueue(){
    	
    }
    //初始化数组
    Object[] initstr = new Object[initLength]; 
    
    /**
     * 向数组中添加元素
     * @param e所添加的数据
     */
	public void add(E e){
		count++;
		if(count>initstr.length){
			Object[] temstr = new Object[initstr.length+increaseLength];
			for(int i=0;i<initstr.length;i++){
				temstr[i]=initstr[i];
			}
			initstr=temstr;
		}
		initstr[count-1]=e;
	}
	
	/**
	 * 获得数组中数据的个数
	 * @return 数据个数
	 */
	public int size(){
		return count;
	}
	
	/**
	 * 通过索引值获得数组中的数据
	 * @param index 索引值
	 * @return 数组中的数据
	 */
	public E get(int index){
		if(index<0||index>initstr.length){
			System.out.println("下标越界");
			return null;
		}
		return (E) initstr[index];
	}
	
	/**
	 * 向数组中插入元素
	 * @param index 插入的位置
	 * @param e 插入的数据
	 */
	public void insert(int index,E e){
		if(index>count||index<0){
			System.out.println("下角标越界");
			return;
		} 
		if(count>initstr.length){
			Object[] temstr = new Object[initstr.length+increaseLength];
			for(int i=0;i<initstr.length;i++){
				temstr[i]=initstr[i];
			}
			initstr=temstr;
		}
		for(int i=count-1;i>=0;i--){
			if(i!=index-1){
				initstr[i+1]=initstr[i];
				continue;
			}
			initstr[index]=e;
			count++;
			return;
		}
	}
	
	/**
	 * 删除数组中指定的元素
	 * @param index 要删除的元素的位置
	 */
	public void delete(int index){
		if(index>count||index<0){
			System.out.println("下角标越界");
			return;
		} 
		for(;index<initstr.length-1;index++){
			initstr[index]=initstr[index+1];
		}
		Object[] temstr = new Object[initstr.length-1];
		for(int i=0;i<temstr.length;i++){
			temstr[i]=initstr[i];
		}
		initstr=temstr;
		count--;
	}
	
	/**
	 * 更改数组中的元素
	 * @param index 要更改的元素的位置
	 * @param e 要更改为的对象
	 */
	public void update(int index,E e){
		initstr[index]=e;
	}
	
	/**
	 * 遍历并打印数组
	 */
	public void printArray(){
		for(int i=0;i<count;i++){
			System.out.print("initstr["+i+"]="+initstr[i]+", ");
			if((i+1)%5==0)
				System.out.println("");
		}
		System.out.println(""+"\n");
	}
}
分享到:
评论

相关推荐

    数组和链表实现队列

    本话题主要探讨了两种常用的数据结构——数组和链表——在实现队列这一线性数据结构时的应用。队列是一种先进先出(First In First Out, FIFO)的数据结构,它的主要操作包括入队(enqueue)、出队(dequeue)以及...

    数组、链表、队列、栈的区别和联系 数组和链表.pdf

    数组、链表、队列、栈的区别和联系 在数据结构中,数组、链表、队列、栈是四种常用的数据结构,它们之间有着紧密的联系,但同时也存在着许多区别。本文将详细介绍数组、链表、队列、栈的区别和联系。 一、数组和...

    Java版数据结构代码,栈,动态数组,队列,链表,二叉树

    在队列的代码中,引用了链表的代码

    数组、链表、队列、栈数据结构特点,各自优点和缺点 数组和链表.pdf

    数组、链表、队列、栈数据结构特点,各自优点和缺点 在计算机科学中,数据结构是指用于组织和存储数据的方式。常见的数据结构包括数组、链表、队列、栈等。每种数据结构都有其特点、优点和缺点,本文将对这些数据...

    循环链表队列 循环数组队列的代码实现

    ### 循环链表队列与循环数组队列的代码实现解析 在计算机科学中,队列是一种重要的数据结构,遵循先进先出(FIFO)原则。队列可以使用多种方式实现,包括链表和数组。本文将深入探讨两种队列实现方式:循环链表队列...

    go语言通过数组和链表的方式实现队列 数组和链表.pdf

    "go语言通过数组和链表的方式实现队列" 从给定的文件信息中,我们可以生成以下知识点: 1.队列的定义:队列是一种特殊的线性表,只能在队列的尾部添加元素,在队列的头部删除元素,先进先出(FIFO)。 2.go语言中...

    队列的链表与数组分别实现

    本篇文章将深入探讨如何用数组和链表两种数据结构来实现队列。 ### 数组实现队列 数组实现队列的优势在于访问速度快,因为数组是连续存储的,可以通过下标直接访问元素。但数组的大小是固定的,所以在创建时需要...

    c++链表队列的实现

    虽然题目要求分析链表队列的实现,但给定的代码片段实际上是实现了基于数组的优先队列,而不是链表队列。这里简单分析一下这段代码的主要部分: #### 1. 基础函数定义 - `FixUp`: 调整堆使之满足大顶堆的性质。 - ...

    数据结构 链表 队列 堆栈

    完整代码 正确产生结果 三个类分开写 class linklist { protected: struct node { int data; node *next; }; node *head; int length; public:

    C语言数据结构链表队列的实现

    C语言数据结构链表队列的实现 1.写在前面  队列是一种和栈相反的,遵循先进先出原则的线性表。  本代码是严蔚敏教授的数据结构书上面的伪代码的C语言实现代码。  分解代码没有包含在内的代码如下: #include #...

    线性结构和非线性结构、稀疏数组、队列、链表(LinkedList) 数组和链表.pdf

    - 队列:一种先进先出(FIFO)的数据结构,适用于任务调度等场景。 - 链表:如单向链表、双向链表和循环链表等。 - 栈:一种后进先出(LIFO)的数据结构,用于表达式求值、函数调用栈等。 #### 二、非线性结构 ...

    数组和链表的对比分析 数组和链表.docx

    - **链表的优势**:适合需要频繁进行插入和删除操作的应用场景,如任务队列管理等。 - **链表的劣势**:查询效率低,不适合需要频繁查询数据的场景。 #### 关于顺序表的改进 对于基于数组的顺序表,可以通过引入...

    同步java之数组与队列

    这种基于数组的队列虽然在空间效率上比链表实现的队列更优,但在动态扩展时可能涉及数组复制,性能相对较差。 在实际应用中,我们需要根据具体需求选择合适的数据结构。例如,对于大量并发插入和删除的操作,`...

    循环数组实现队列

    * 链式存储结构:使用链表来存储队列的元素,不在本文中讨论。 3. 队列的实现: * 构造函数(MyQueue):初始化队列,分配内存空间。 * 析构函数(~MyQueue):释放队列占用的内存空间。 * 将队列置空...

    数组、链表、堆栈和队列、线性表和顺序表 数组和链表.pdf

    数组、链表、堆栈和队列、线性表和顺序表 数组、链表、堆栈和队列是最基本的数据结构,任何程序都会涉及到其中的一种或多种。数据结构是指数据之间的相互关系,即组织形式,有逻辑结构和物理结构之分。逻辑结构有...

    常见的数据结构(栈、队列、数组、链表和红黑树) 数组和链表.pdf

    常见的数据结构(栈、队列、数组、链表和红黑树) 数组和链表.pdf

    数据结构学习代码,内容包括:稀疏数组、队列、链表、栈、递归的使用、排序

    数据结构学习代码,内容包括:稀疏数组、队列、链表、栈、递归的使用、排序算法、查找算法、哈希表、树结构_DataStructure

    java使用数组和链表实现队列示例

    队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,只允许在表的后端(rear)进行插入操作,下面介绍一下java使用数组和链表实现队列的示例

Global site tag (gtag.js) - Google Analytics