- 浏览: 539978 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
GGGGeek:
看完了博主的博文,如果没猜错的话应该是浙大吧?很多优秀的人因为 ...
转《D君的故事》 以时刻警示自己 -
游牧民族:
楼主写的不错,学习了,最近对爬虫比较感兴趣,也写了些爬虫相关的 ...
通用爬虫框架及heritrix爬虫介绍 -
jimmee:
jerome_s 写道ice 你怎么看? 粗略的看了一下ice ...
MessagePack, Protocol Buffers和Thrift序列化框架原理和比较说明 -
jerome_s:
ice 你怎么看?
MessagePack, Protocol Buffers和Thrift序列化框架原理和比较说明 -
jimmee:
nk_tocean 写道照着做了,但是不行啊,还是乱码.先确认 ...
hive编写udf处理非utf-8数据
2.栈和队列
所谓的栈,是一个含有至少两个基本操作的抽象数据类型:插入新的元素;删除最近时间插入的元素。遵循FILO(First in,last out,先进后出)的原则。
所谓的队列,也是一个含有至少两个基本操作的抽象数据类型:插入新的元素;删除最久时间插入的元素。遵循FIFO(First in,first out,先进先出)的原则。
关于栈和队列的具体实现,我们即可以借助于数组,也可以采用链表来实现。
1) 栈的数组实现方式
2) 栈的链式实现方式
3) 队列的数组实现
数组的另一种更简单的实现方式:
4) 队列的链式实现方式
所谓的栈,是一个含有至少两个基本操作的抽象数据类型:插入新的元素;删除最近时间插入的元素。遵循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; } }
发表评论
-
moses安装记录
2016-12-11 11:00 01. moses的安装说明地址(注意,一定要安装好相应的bo ... -
翻译算法
2016-12-09 07:50 0翻译的概率T=argsMaxP(T|S)=P(T)P(S|T ... -
JPEG 简易文档 V2.15【转载】
2016-04-10 16:35 635JPEG 简易文档 V2.15 ------------- ... -
Java 并发之 ConcurrentSkipListMap 简述
2015-09-20 20:24 1125JCIP 提到了在 Java 6 中引入了两个新的并发集合类 ... -
最简单的平衡树(红-黑树)的实现
2015-09-04 08:04 1190在二叉搜索树(BST)的基础上,要实现一颗平衡树,可以使用 ... -
lucene索引创建的理解思路
2014-06-29 23:12 1485虽然lucene4很早就出来,但是这里仍然以lucene3. ... -
lucene的拼写检查的实现原理
2014-06-08 18:19 13161. 建索引时, 使用ngram的方式创建索引 Sp ... -
字符串相似算法-(3) NGram Distance
2014-06-08 17:54 4903就是N-Gram version of edit dista ... -
字符串相似算法-(2) Levenshtein distance
2014-06-08 16:32 2231编辑距离概念描述: ... -
字符串相似算法-(1) Jaro-Winkler Distance
2014-06-08 12:05 6759Jaro-Winkler Distance 算法 ... -
Lucene的数字范围搜索 (Numeric Range Query)原理
2014-04-05 16:08 135550. 全文索引的核心就是倒排索引. 1. 若 ... -
UDT协议-基于UDP的可靠数据传输协议的实现分析(7)-流量和拥塞控制
2014-04-02 20:53 4143流量控制 对于一个带宽1Gbps, RTT为100ms的网络 ... -
UDT协议-基于UDP的可靠数据传输协议的实现分析(6)-链接的建立和关闭
2014-04-01 22:47 20491. 模式有client/server mode(客户端, ... -
协议-基于UDP的可靠数据传输协议的实现分析(5)-可靠性怎么保证
2014-03-31 23:08 3782发送方的处理:1) 包发送确认后,由于还没有收到确认,先缓存 ... -
UDT协议-基于UDP的可靠数据传输协议的实现分析(4)-发送和接收的算法
2014-03-30 10:09 71530. 计时器udt有四种计时器: ACK, NAK, E ... -
UDT协议-基于UDP的可靠数据传输协议的实现分析(3)-包结构说明
2014-03-29 17:24 3202udt的包结构1. 数据包,基本结构如下: 0 ... -
UDT协议-基于UDP的可靠数据传输协议的实现分析(2)-为什么要用udt
2014-03-28 08:00 37640. AIMD算法的简单回顾 (1) 慢开始 ... -
UDT协议-基于UDP的可靠数据传输协议的实现分析(1)-准备工作
2014-03-27 12:52 38191. 协议实现方案: Yunhong Gu提出的rfc的草 ... -
mapreduce的一些算法设计,优化等(2)
2014-01-28 15:50 14731. 反序(order inversion ... -
mapreduce的一些算法设计,优化等(1)
2014-01-27 17:15 2076本系列是根据书籍《Da ...
相关推荐
《数据结构习题解析-第二版殷人昆》是一本专为学习数据结构而设计的习题解答手册,由殷人昆编著,是清华大学出版社2011年出版的重要教材辅助资料。这本书针对C++语言实现的数据结构进行了深入浅出的讲解,旨在帮助...
再来说说队列,它是另一种基本的数据结构,遵循先进先出(FIFO)的原则。在Java中,队列可以通过`java.util.Queue`接口实现,常见的实现类有`LinkedList`和`ArrayDeque`。队列的主要操作包括入队(enqueue,将元素...
本项目聚焦于“串”的基本操作,这是一种常见的线性数据结构,通常用于存储文本信息。在这里,我们将深入探讨串的基本操作,以及如何通过编程实现这些操作。 串是由字符组成的序列,通常在许多编程语言中被表示为...
数据结构主要包括数组、链表、栈、队列、树、图等基本类型。在C++中,这些数据结构可以通过自定义类来实现。例如,数组是最基础的数据结构,它可以被直接用C++的动态数组或std::vector模板类来表示;链表则可以通过...
1. **数据结构基础**:首先,我们需要理解基本的数据结构类型,如数组、链表、栈、队列等。数组是最基础的数据结构,提供随机访问;链表允许动态插入和删除,但访问效率较低;栈遵循“后进先出”(LIFO)原则,常...
在这个《数据结构课程设计》项目中,我们专注于二叉树的基本操作,通过两个源文件(file1.cpp 和 file2.cpp)以及一个头文件(head.h)实现了一系列的二叉树操作。以下是这些操作的详细说明: 1. **创建二叉树**:...
联众HIS1.0版数据结构说明书详细阐述了该医疗信息系统的数据组织方式,为理解和操作该系统提供了基础。HIS(Hospital Information System)是医院信息系统,它整合了医院内的各种信息资源,实现了医疗业务流程的自动...
作者采用了独特的方法将数据结构分成说明和实现两部分,并充分利用了已有的数据结构库(Java集合类API)。本书分为四个部分:第一部分讨论适合大多数应用的集合类API的一个子集,并覆盖基本的算法分析技术、递归和...
本资源提供了数据结构题集的完整答案,涵盖了数据结构的基本概念、抽象数据类型、存储结构、数据类型等方面的知识点。下面是对资源中提到的知识点的详细解释: 1. 数据结构的基本概念 根据题目,数据是对客观事物...
第一部分:数据结构与算法的基本概念 考核内容: 算法、算法正确性、复杂性; 算法的时间与空间复杂性级别; 数据类型、数据结构和表示、实现; 抽象数据类型的说明、高级语言对抽象数据类型的支持 考核要求: 理解...
基于C语言实现的基本数据结构定义以及简单的解题应用项目源码.zip基于C语言实现的基本数据结构定义以及简单的解题应用项目源码.zip基于C语言实现的基本数据结构定义以及简单的解题应用项目源码.zip基于C语言实现的...
本书的内容和编排与之前1992年出版的《数据结构》第二版基本一致,但更加强调了抽象数据类型的概念,采用类C语言作为数据结构和算法的描述语言,并包含与教材配套的辅助教学软件,该软件可以在DOS和Windows环境下...
2. **数据结构选择**:说明所选用的数据结构,比如可能选择链表实现队列,二叉树实现搜索结构等,解释选择的理由。 3. **算法设计**:详细描述用于操作数据结构的算法,如排序、查找等,可以包括插入、删除、查找等...
资料包中的例题可能涵盖这些数据结构和算法的实际应用,例如如何使用栈实现括号匹配,如何用二叉树解决二分查找问题,或是如何运用图算法求解最短路径问题。通过解决这些例题,我们可以巩固理论知识,并提升实际编程...
作者采用了独特的方法将数据结构分成说明和实现两部分,并充分利用了已有的数据结构库(Java集合类API)。本书分为四个部分:第一部分讨论适合大多数应用的集合类API的一个子集,并覆盖基本的算法分析技术、递归和...
接下来,我将详细说明算法文档和基本数据结构中的一些关键知识点。 算法文档的写作通常遵循以下结构: 1. 引言:这部分一般会解释算法的背景,应用场景以及算法的目的和功能。 2. 算法描述:这是算法文档的核心...
综上所述,本文档《图解数据结构》通过一系列生动的图解,清晰地说明了线性表的基本概念和操作,特别是在顺序表和单链表的插入、删除等关键操作上的演示,为学习者提供了宝贵的视觉辅助。这样的资料对于准备计算机...
数据结构作业通常会涵盖这些基本数据结构的操作,例如,用C++实现栈的基本操作、链表的反转、二叉树的遍历等,以提升对数据结构的实际运用能力。 四、数据结构学习指导 学习数据结构时,应理解每个结构的特性和适用...
首先,我们需要理解数据结构的基本概念。数据结构是研究数据的逻辑结构、物理结构以及它们之间的相互关系。在计算机程序中,数据往往不是无序的,而是具有一定的结构,比如电话号码查询系统中的名字与电话号码对应...