java之实现 线性表、栈和队列
来源:互联网 发布:网络cn是什么意思啊 编辑:程序博客网 时间:2024/06/15 09:04
线性表是存储顺序牌类的数据时最常用的数据结构。
实现线性表有两种方式。第一种是使用数组存储线性表的元素。数组是动态创建的。超过数组的容量时,创建一个
新的更大的数组,并且将当前数组中的元素复制到新建的数组中。另一种方法是用链表结构实现。链表由节点组成,每
个结点都是动态生成的,用来存储一个元素。所有的结点连接成一个线性表。
对于线性表的主要操作有:
1、提取线性表的元素
2、在线性表中插入一个新元素
3、从线性表中删除一个元素
4、获取线性表中元素的个数
5、查找线性表中是否包含某个元素
6、判断线性表是否为空
下面这个接口类定义了常用的操作。
package list_test;public interface MyList {public void add(Object o);public void add(int index, Object o);public void clear();public boolean contains(Object o);public Object get(int index);public int indexOf(Object o);public boolean isEmpty();public int lastIndexOf(Object o);public boolean remove(Object o);public Object remove(int index);public Object set(int index, Object o);public int size();}
然后用MyAbstractList实现其中一部分方法:
package list_test;public abstract class MyAbstractList implements MyList {protected int size = 0;protected MyAbstractList() {}protected MyAbstractList(Object[] objects) {for (int i = 0; i < objects.length; i++) {this.add(objects[i]);}}public void add(Object o) {add(size, o);}public boolean isEmpty() {return size == 0;}public int size() {return size;}public boolean remove(Object o) {if (indexOf(o) >= 0) {remove(indexOf(o));return true;} else {return false;}}}
接下来用数组实现线性表。数组的类型是Object[]类型,所以,数组中每个元素实际元素存储的是对象的引用。
package list_test;/** * @author */public class MyArrayList extends MyAbstractList {public static final int INITIAL_CAPACITY = 16;private Object[] data = new Object[INITIAL_CAPACITY];public MyArrayList() {}public MyArrayList(Object[] objects) {data = objects;size = objects.length;}@Overridepublic void add(int index, Object o) {ensureCapacity();for (int i = size - 1; i >= index; i--) {data[i + 1] = data[i];}data[index] = 0;size++;}private void ensureCapacity() {if (size >= data.length) {Object[] newData = new Object[data.length * 2];System.arraycopy(data, 0, newData, 0, data.length);data = newData;}}@Overridepublic void clear() {// TODO Auto-generated method stubdata = new Object[INITIAL_CAPACITY];}@Overridepublic boolean contains(Object o) {// TODO Auto-generated method stubfor (int i = 0; i < size; i++) {if (o.equals(data[i])) {return true;}}return false;}@Overridepublic Object get(int index) {// TODO Auto-generated method stubreturn data[index];}@Overridepublic int indexOf(Object o) {// TODO Auto-generated method stubfor (int i = 0; i < data.length; i++) {if (o.equals(data[i])) {return i;}}return -1;}@Overridepublic int lastIndexOf(Object o) {// TODO Auto-generated method stubfor (int i = size - 1; i >= 0; i--) {if (o.equals(data[i])) {return i;}}return -1;}@Overridepublic Object remove(int index) {// TODO Auto-generated method stubObject o = data[index];for (int i = index; i < size - 1; i++) {data[i] = data[i + 1];}size--;return o;}@Overridepublic Object set(int index, Object o) {// TODO Auto-generated method stubObject oldObject = data[index];data[index] = o;return oldObject;}public String toString(){StringBuffer result = new StringBuffer("[");for (int i = 0; i < size; i++) {result.append(data[i]);if (i < size -1) {result.append(", ");}}return result.toString() + "]";}}
栈可以看作是一种特殊的线性表,访问、插入和删除它的元素只能在栈的一端来进行。
队列表示一个排队等待的线性表。它的元素只能从队尾插入,从队首访问和删除。
由于栈只允许在栈顶进行插入和删除操作。所以用数组线性表来实现栈比用链表来实现效率高。由于删除是在线
性表的开头进行,所以,用链表来实现队列比用数组线性表效率高。
下面是用包装方式实现的栈类和队列类。
package queue_and_stack;import list_test.MyLinkedList;//栈public class MyStack {private MyLinkedList list = new MyLinkedList();public void push(Object o) {list.addLast(o);}public Object pop() {return list.removeLast();}public int getSize() {return list.size();}public String toString() {return "Stack: " + list.toString();}}
package queue_and_stack;import list_test.MyLinkedList;//队列public class MyQueue {private MyLinkedList list = new MyLinkedList();public void enqueue(Object o) {list.addLast(o);}public Object dequeue() {return list.removeFirst();}public int getSize() {return list.size();}public String toString() {return "Queue: " + list.toString();}}
下面是一个测试类。
package queue_and_stack;public class TestStackQueue {public static void main(String[] args) {//// test stackMyStack stack = new MyStack();stack.push("a");System.out.println("(1)" + stack);stack.push("b");System.out.println("(2)" + stack);stack.push("c");stack.push("d");System.out.println("(3)" + stack);System.out.println("(4)" + stack.pop());System.out.println("(5)" + stack.pop());System.out.println("(6)" + stack);//// test queueMyQueue queue = new MyQueue();queue.enqueue("1");System.out.println("(1) " + queue);queue.enqueue("2");System.out.println("(2) " + queue);queue.enqueue("3");queue.enqueue("4");System.out.println("(3) " + queue);System.out.println("(4) " + queue.dequeue());System.out.println("(5) " + queue.dequeue());System.out.println("(6) " + queue);}}
对于一个栈来说,push(o)方法是将一个元素添加到栈顶,pop()方法是将栈顶的元素删除并返回此元素。
对于一个队列来书,enqueue(o)方法是将一个元素添加到队尾,dequeue()方法是将队列头的元素删除。
- java之实现 线性表、栈和队列
- 线性表、链表、栈、队列之java实现
- java数据结构之线性队列的实现
- Java之数据结构基础、线性表、栈和队列、数组和字符串,树—学习笔记
- Java之数据结构基础、线性表、栈和队列、数组和字符串,树—学习笔记
- JAVA源码中线性表,栈和队列的实现及其对应的源码文件
- 线性表 及Java实现 顺序表、链表、栈、队列
- 线性表 及Java实现 顺序表、链表、栈、队列
- 线性表 及Java实现 顺序表、链表、栈、队列
- 线性表 && 栈和队列
- 线性表、栈和队列
- 栈,队列和线性表
- 线性表、栈、队列和优先队列
- Java数据结构-线性表之队列
- [Java数据结构]线性表之队列Queue
- 数据结构复习之线性表、栈和队列 (上)
- 数据结构复习之线性表、栈和队列 (下)
- 【数据结构】数据结构总结之线性表、栈和队列
- CEdit用法小记
- HDU2602--Bone Collector--动态规划
- Everything:速度最快的文件名搜索工具(2011-12更新)
- ltib(1)初识
- Apache+PHP+MySql 的配置
- java之实现 线性表、栈和队列
- java 内省的使用
- ltib(2)小试
- HDU1087--Super Jumping! Jumping! Jumping!
- ltib(3)在嵌入式系统中实现nfs服务器
- 游戏物体跟随鼠标移动
- ltib(4)实现telnet服务器/etc/securetty
- 关于水晶报表“已达到系统管理员的最大报表处理作业数限制”解决
- JAVA多线程中,原子操作的概念——原子操作真的不需要进行同步控制吗?