`
jimmee
  • 浏览: 539978 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

基本数据结构的说明(二)

阅读更多
2.栈和队列
所谓的栈,是一个含有至少两个基本操作的抽象数据类型:插入新的元素;删除最近时间插入的元素。遵循FILO(First in,last out,先进后出)的原则。
所谓的队列,也是一个含有至少两个基本操作的抽象数据类型:插入新的元素;删除最久时间插入的元素。遵循FIFO(First in,first out,先进先出)的原则。
关于栈和队列的具体实现,我们即可以借助于数组,也可以采用链表来实现。
1) 栈的数组实现方式
public class MyStack<E> {
	public int count;
	public Object [] items;
	
	public boolean isEmpty(){
		return count==0;
	}
	
	public MyStack (){

		items=new Object[20];
		count=0;
	}
	
	public MyStack (int len){

		items=new Object[len];
		count=0;
	}
	
	/**
	重新调整数组的大小
	**/
	private void resize(int size){
		Object [] newItems=new Object[size];
		for(int i=0;i<count;i++){
			newItems[i]=items[i];
		}
		items=newItems;
	}
	
	public void push(E e){
		if(count==items.length) resize(2*items.length);
		
		items[count++]=e;
	}
	
	public E pop(){
		if(count==0) return null;
		E item=(E)items[count-1];
		items[count-1]=null;
		count--;
		if(count>0&&count<=items.length/4) resize(items.length/2);
		return item;
	}
	
	public E peek(){
		if(count==0) return null;
		
		E item=(E)items[count-1];
		
		return item;
	}
}

2) 栈的链式实现方式
public class MyStack<E> {
	private class Node{
		E item;
		Node next;
	}
	
	Node head;
	
	public boolean isEmpty(){
		return head==null;
	}
	
	public void push(E t){
		Node node=new Node();
		node.item=t;
		node.next=head;
		head=node;
	}
	
	public E pop(){
		
		if(head==null)
			return null;
		E t=head.item;
		head=head.next;
		
		return t;
	}
	
	public E peek(){
		if(head==null)
			return null;
		else
			return head.item;
	}
}

3) 队列的数组实现
public class ArrayQueue<E> {
	private int front;
	private int rear;
	private int count;
	private int capacity;
	private int capacityIncrement;
	
	
	private Object[] itemArray;
	
	public ArrayQueue(){
		front=0;
		rear=0;
		count=0;
		capacity=10;
		capacityIncrement=5;
		itemArray=new Object[capacity];
	}
	
	public boolean empty(){
		return count==0;
	}
	
	public void insert(E e){
		if(count==capacity){
			capacity+=capacityIncrement;
			Object [] newArray=new Object[capacity];
//			for(int i=0;i<count;i++){
//				newArray[i]=itemArray[i];
//			}
			if(front<rear){
				//如果元素位于itemArray[front:rear-1]中
				for(int i=front;i<rear;i++){
					newArray[i]=itemArray[i];
				}
			}else{
				//否则,将元素分成两个区间
				//区间1:itemArray[0:rear-1]
				for(int i=0;i<rear;i++){
					newArray[i]=itemArray[i];
				}
				//区间2:itemArray[front:count-1]
				for(int i=front;i<count;i++){
					newArray[i]=itemArray[i];
				}
				
				front+=capacityIncrement;//然后,将front改为指向其新位置
			}
			itemArray=newArray;
		}
		itemArray[rear]=e;
		rear=(rear+1)%capacity;
		count++;
	}
	
	public E remove(){
		if(count==0){
			return null;
		}
		else{
			E temp=(E) itemArray[front];
			itemArray[front]=null;
			front=(front+1)%capacity;
			count--;
			
			return temp;
		}
	}
}

数组的另一种更简单的实现方式:
import java.util.NoSuchElementException;

public class ArrayQueue {
	protected Object [] data;
	protected int size,
					head,
					tail;
	public ArrayQueue(){
		final int INITIAL_LENGTH=100;
		data=new Object[INITIAL_LENGTH];
		size=0;
		head=0;
		tail=-1;
	}
	
	public int size(){
		return size;
	}
	
	public boolean isEmpty(){
		return size==0;
	}
	
	public Object front(){
		if(size==0)
			throw new NoSuchElementException();
		return data[head];
	}
	
	public void enqueue(Object element){
		if(size==data.length){
			//double the length of data
			Object [] oldData=data;
			data=new Object[data.length*2];
			
			//copy oldData[head...OldData.length-1]
			//to  data[0... OldData.length-1-head] 
			System.arraycopy(oldData, head,data , 0, oldData.length-head);
			
			if(head>0)
				//copy oldData[0...tail] to data [head+1 .. oldlenght-1]
				System.arraycopy(oldData, 0, data, head+1, tail+1);
			head=0;
			tail=oldData.length-1;
		}
		
		tail=(tail+1)%data.length;
		size++;
		data[tail]=element;
	}
	
	public Object dequeue(){
		if(size--==0){
			throw new NoSuchElementException();
		}
		Object element=data[head];
		head=(head+1)%data.length;
		
		return element;
	}
					
}

4) 队列的链式实现方式
public class ListQueue<E> {
	private class Node<E>{
		E item;
		Node<E> link;
	}
	
	private Node<E> front,rear;
	private int count;
	
	public boolean empty(){
		return count==0;
	}
	
	public void insert(E e){
		//如果队列为空
		Node<E> newNode=new Node<E>();
		newNode.item=e;
		
		if(rear==null){
			front=rear=newNode;
		}else{
			rear.link=newNode;
			rear=newNode;
		}
		count++;
	}
	
	public E remove(){
		if(count==0){
			return null;
		}else{
			E e=front.item;
			front=front.link;
			if(front==null){
				rear=null;
			}
			
			count--;
			
			return e;
		}
	}
	
	public ListQueue<E> clone(){
		ListQueue<E> Q=new ListQueue<E>();
		
		for(Node<E> t=front;t!=null;t=t.link)
			Q.insert(t.item);
		return Q;
	}
}

分享到:
评论
2 楼 qiu768 2009-11-07  
这种内容有必要发到首页上来吗?
1 楼 iaimstar 2009-11-05  
符号美

相关推荐

    数据结构习题解析-第二版殷人昆

    《数据结构习题解析-第二版殷人昆》是一本专为学习数据结构而设计的习题解答手册,由殷人昆编著,是清华大学出版社2011年出版的重要教材辅助资料。这本书针对C++语言实现的数据结构进行了深入浅出的讲解,旨在帮助...

    数据结构JAVA实现

    再来说说队列,它是另一种基本的数据结构,遵循先进先出(FIFO)的原则。在Java中,队列可以通过`java.util.Queue`接口实现,常见的实现类有`LinkedList`和`ArrayDeque`。队列的主要操作包括入队(enqueue,将元素...

    数据结构课程设计:串基本操作演示

    本项目聚焦于“串”的基本操作,这是一种常见的线性数据结构,通常用于存储文本信息。在这里,我们将深入探讨串的基本操作,以及如何通过编程实现这些操作。 串是由字符组成的序列,通常在许多编程语言中被表示为...

    殷人昆数据结构用面向对象方法与C++语言描述第二版扫描版

    数据结构主要包括数组、链表、栈、队列、树、图等基本类型。在C++中,这些数据结构可以通过自定义类来实现。例如,数组是最基础的数据结构,它可以被直接用C++的动态数组或std::vector模板类来表示;链表则可以通过...

    自考数据结构课本说明

    1. **数据结构基础**:首先,我们需要理解基本的数据结构类型,如数组、链表、栈、队列等。数组是最基础的数据结构,提供随机访问;链表允许动态插入和删除,但访问效率较低;栈遵循“后进先出”(LIFO)原则,常...

    《数据结构课程设计》二叉树基本操作实验程序(10种基本操作)

    在这个《数据结构课程设计》项目中,我们专注于二叉树的基本操作,通过两个源文件(file1.cpp 和 file2.cpp)以及一个头文件(head.h)实现了一系列的二叉树操作。以下是这些操作的详细说明: 1. **创建二叉树**:...

    联众HIS1.0版数据结构说明书.docx

    联众HIS1.0版数据结构说明书详细阐述了该医疗信息系统的数据组织方式,为理解和操作该系统提供了基础。HIS(Hospital Information System)是医院信息系统,它整合了医院内的各种信息资源,实现了医疗业务流程的自动...

    数据结构与算法分析_java语言描述

    作者采用了独特的方法将数据结构分成说明和实现两部分,并充分利用了已有的数据结构库(Java集合类API)。本书分为四个部分:第一部分讨论适合大多数应用的集合类API的一个子集,并覆盖基本的算法分析技术、递归和...

    严蔚敏数据结构题集(C语言版)完整答案.doc

    本资源提供了数据结构题集的完整答案,涵盖了数据结构的基本概念、抽象数据类型、存储结构、数据类型等方面的知识点。下面是对资源中提到的知识点的详细解释: 1. 数据结构的基本概念 根据题目,数据是对客观事物...

    数据结构学位复习课-上海交通大学.pdf

    第一部分:数据结构与算法的基本概念 考核内容: 算法、算法正确性、复杂性; 算法的时间与空间复杂性级别; 数据类型、数据结构和表示、实现; 抽象数据类型的说明、高级语言对抽象数据类型的支持 考核要求: 理解...

    基于C语言实现的基本数据结构定义以及简单的解题应用项目源码.zip

    基于C语言实现的基本数据结构定义以及简单的解题应用项目源码.zip基于C语言实现的基本数据结构定义以及简单的解题应用项目源码.zip基于C语言实现的基本数据结构定义以及简单的解题应用项目源码.zip基于C语言实现的...

    数据结构(C语言版严蔚敏著)

    本书的内容和编排与之前1992年出版的《数据结构》第二版基本一致,但更加强调了抽象数据类型的概念,采用类C语言作为数据结构和算法的描述语言,并包含与教材配套的辅助教学软件,该软件可以在DOS和Windows环境下...

    数据结构课程设计模板

    2. **数据结构选择**:说明所选用的数据结构,比如可能选择链表实现队列,二叉树实现搜索结构等,解释选择的理由。 3. **算法设计**:详细描述用于操作数据结构的算法,如排序、查找等,可以包括插入、删除、查找等...

    数据结构与算法例题 及说明

    资料包中的例题可能涵盖这些数据结构和算法的实际应用,例如如何使用栈实现括号匹配,如何用二叉树解决二分查找问题,或是如何运用图算法求解最短路径问题。通过解决这些例题,我们可以巩固理论知识,并提升实际编程...

    数据结构与问题求解Java语言

    作者采用了独特的方法将数据结构分成说明和实现两部分,并充分利用了已有的数据结构库(Java集合类API)。本书分为四个部分:第一部分讨论适合大多数应用的集合类API的一个子集,并覆盖基本的算法分析技术、递归和...

    算法文档无代码基本数据结构

    接下来,我将详细说明算法文档和基本数据结构中的一些关键知识点。 算法文档的写作通常遵循以下结构: 1. 引言:这部分一般会解释算法的背景,应用场景以及算法的目的和功能。 2. 算法描述:这是算法文档的核心...

    [详细完整版]图解数据结构.pdf

    综上所述,本文档《图解数据结构》通过一系列生动的图解,清晰地说明了线性表的基本概念和操作,特别是在顺序表和单链表的插入、删除等关键操作上的演示,为学习者提供了宝贵的视觉辅助。这样的资料对于准备计算机...

    C++数据结构资料.zip

    数据结构作业通常会涵盖这些基本数据结构的操作,例如,用C++实现栈的基本操作、链表的反转、二叉树的遍历等,以提升对数据结构的实际运用能力。 四、数据结构学习指导 学习数据结构时,应理解每个结构的特性和适用...

    Java版数据结构(程序员必须看)

    首先,我们需要理解数据结构的基本概念。数据结构是研究数据的逻辑结构、物理结构以及它们之间的相互关系。在计算机程序中,数据往往不是无序的,而是具有一定的结构,比如电话号码查询系统中的名字与电话号码对应...

Global site tag (gtag.js) - Google Analytics