`
jimmee
  • 浏览: 530711 次
  • 性别: 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  
符号美

相关推荐

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

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

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

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

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

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

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

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

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

    串基本操作演示代码加报告,报告里面有使用说明书

    数据结构与算法分析,主要包括最基本的说明和基本算法举例说明.

    数据结构与算法分析,主要包括最基本的说明和基本算法举例说明.

    图解数据结构--使用Java

    全书内容浅显易懂,利用大量且丰富的图示与范例, 详解复杂的抽象理论,从最基本的数据结构概念开始 说明,再以Java工具加以诠释阵列结构、堆栈、链表 、队列、排序、查找等重要的概念,引领读者抓住重 点轻松进入...

    数据结构JAVA实现

    JAVA实现链表 有序二叉树 队列的代码例子

    数据结构课程设计,数据结构课程设计

    数据结构课程设计,本课程设计是为了配合《数据结构》课程的开设,通过设计一完整的程序,使学生能达到如下要求: 1. 了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力; 2. 初步掌握软件开发过程...

    数据结构教程,含习题和答案

    包括习题与答案及要点,很实用啊 ... 数据结构的定义虽然没有标准,但是它包括以下三方面内容:逻辑结构、存储结构、和对数据的操作。这一段比较重要,我用自己的语言来说明一下,大家看看是不是这样。

    C#数据结构

    数据结构形成了程序员基本数据结构工具箱(toolkit)。对于许多常见的问题,工 具箱里的数据结构是理想的选择。就像.NET Framework 中Windows应用程序开 发中的工具箱,程序员可以直接拿来或经过少许的修改就可以使用...

    数据结构学习资料

    它基本上涉及了数据结构基础的“方方面面”。很难想象这书的厚度,居然能讲这么多内容(你看看算法导论有多厚就知道我在说什么了)。 它在内容上并不乏深度。高级数据结构部分并不容易,如果你第一次就全部耐心看完...

    数据结构与算法分析学习笔记

    数据结构与算法分析 经典笔记学习笔记 1 前言 1.1 所选教材 1.2 写作原因 1.3 一些约定 1.4 历史记录 1.5 联系方式 2 单链表 2.1 代码实现 2.2 效率问题 2.3 应用:一元多项式(加法和乘法) 2.3.1 基础知识 2.3.2 ...

    数据结构大作业+设计说明书

    (3) 录入:可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定) (4) 查询:可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满...

    数据结构课程设计学生成绩管理系统方案.doc

    任 务 书 "题目:学生成绩管理系统 " "设计容与要求... 1968年美国唐·欧·克努特教授开创了数据结构的最初体系,他所著的《计算机程序设计技 巧》第一卷《基本算法》是第一本较系统地阐述数据的逻辑结构和存储结构与其

    最简单易懂的数据结构

    一、基本概念和术语 数据(Data) 数据是信息的载体。它能够被计算机识别、存储和加工处理,是计算机程序加工...为了增加对数据结构的感性认识,下面举例来说明有关数据结构的概念。 【例1.1】 学生成绩表,见下表。

    SQL数据结构.doc

    数据结构 一、基本信息数据结构 1、商品基本资料数据结构 说明: "Products "商品信息表 " "Barcode "一品多码表 " "Unit "商品单位表 " "Price "价格表 " "MedType "剂型表 " 2、往来单位基本信息 说明: "Clients ...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    2.4.3 三种基本结构和改进的流程图 28 2.4.4 用N-S 流程图表示算法 29 2.4.5 用伪代码表示算法 30 2.4.6 用计算机语言表示算法 31 2.5 结构化程序设计方法 31 3 数据类型、运算符与表达式 3.1 C语言的数据类型 32 ...

    天健医院信息系统数据结构手册.doc

    天健医疗HIS系统的数据库表结构说明,再数据分析时可以帮助不了解的数据结构的工程师,快速的了解详细的数据情况。

    数据结构栈的实验报告.doc

    《数据结构》课程第三次实验报告 实验报告(三) "姓名 " "学号 " "班级 " " "实验名称 "顺序栈的基本操作 "实验日期 " "机房 " " "实验报告 " "1. 说明自己在实验操作过程中遇到的难点及解决方法 " "难点: " "1....

Global site tag (gtag.js) - Google Analytics