堆栈和队列的java实现
来源:互联网 发布:希色官方旗舰店 淘宝 编辑:程序博客网 时间:2024/05/17 07:38
1.堆栈
堆栈是一种后进先出(LIFO)的数据结构。主要要实现的方法有判断堆栈是否为空,输出堆栈的顶部元素,添加元素,删除元素,创建一个包含这几个方法的接口如下:
public interface Stack { public boolean isEmpty(); //判断堆栈是否为空 public Object peek(); //返回堆栈的顶部元素 public void push(Object theElement); //从顶部添加元素 public Object pop(); //删除顶部元素并返回被删除的元素}
1.数组实现
import java.lang.reflect.Array;import java.util.EmptyStackException;public class ArrayStack implements Stack{ int top; //current top of stack Object element[]; //element array /**create a stack with the given initial capacity *@throws IlleagalArgumentException when initialCapacity<1*/ public ArrayStack(int initialCapacity){ if(initialCapacity<1){ throw new IllegalArgumentException ("initialCapacity must be >=1"); } element=new Object[initialCapacity]; top=-1; } /**create a stack with initial capacity 10*/ public ArrayStack(){ this(10); } /** @return true iff stack is empty*/ @Override public boolean isEmpty() { // TODO Auto-generated method stub return top==-1; } /** @return top element of stack * @throw EmptyStackException when the stack is empty*/ @Override public Object peek() { // TODO Auto-generated method stub if(isEmpty()){ throw new EmptyStackException(); } return element[top]; } /** add the element to the top of stack*/ @Override public void push(Object theElement) { // TODO Auto-generated method stub //increase array size if necessary if(top==element.length-1){ element=changeArrayLength1D(element,2*element.length); } //put the element at the top of stack element[++top]=theElement; } private Object[] changeArrayLength1D(Object[] element2, int i) { // TODO Auto-generated method stub if(element2.length>i){ throw new IllegalArgumentException("new length too small"); } Object newArray[]=(Object[])Array.newInstance(element2.getClass().getComponentType(), i); System.arraycopy(element2, 0, newArray, 0, element2.length); return newArray; } /** @return top element of stack * remove top element of stack * @throw EmptyStackException when the stack is empty*/ @Override public Object pop() { // TODO Auto-generated method stub if(isEmpty()){ throw new EmptyStackException(); } Object topElement=element[top]; element[top--]=null; //enable garbage collection return topElement; } /** @return string converted from stack*/ public String toString(){ StringBuilder s=new StringBuilder("["); for(int i=top;i>=0;i--){ s.append(element[i].toString()+","); } s.append("]"); return s.toString(); }}
构造方法的复杂度是O(n),isEmpty(),peek(),pop方法的复杂度为O(1),push的复杂度是O(n)(当不需要增加容量时为O(1)),toString()方法的复杂度为O(n)。
2.链式实现
import java.util.EmptyStackException;class ChainNode{ Object element; ChainNode next; ChainNode(){} ChainNode(Object element){ this.element=element; } ChainNode(Object element,ChainNode next){ this.element=element; this.next=next; }}public class LinkedStack implements Stack{ protected ChainNode topNode; public LinkedStack(int initialCapacity){} public LinkedStack(){} @Override public boolean isEmpty() { // TODO Auto-generated method stub return topNode==null; } @Override public Object peek() { // TODO Auto-generated method stub if(isEmpty()){ throw new EmptyStackException(); } return topNode.element; } @Override public void push(Object theElement) { // TODO Auto-generated method stub topNode=new ChainNode(theElement,topNode); } @Override public Object pop() { // TODO Auto-generated method stub if(isEmpty()){ throw new EmptyStackException(); } Object topElement=topNode.element; topNode=topNode.next; return topElement; } public String toString(){ StringBuilder s=new StringBuilder("["); ChainNode p=topNode; while(p!=null){ s.append(p.element.toString()+","); p=p.next; } s.append("]"); return s.toString(); }}
除了toString()方法复杂度为O(n)外,其余方法复杂度都为O(1)。
2.队列
队列是一种先进先出(FIFO)的数据结构。主要要实现的方法和堆栈是差不多的,创建一个队列接口如下:
public interface Queue { public boolean isEmpty(); public Object getFrontElement();//得到队列前端元素 public Object getRearElement(); //得到队列末端元素 public void put(Object theElement); public Object remove();}
1.数组实现
import java.lang.reflect.Array;public class ArrayQueue implements Queue{ private int front,rear; private Object[] element; public ArrayQueue(int initialCapacity){ front=0; rear=0; element=new Object[initialCapacity]; } public ArrayQueue(){ this(10); } @Override public boolean isEmpty() { // TODO Auto-generated method stub return rear==front; } @Override public Object getFrontElement() { // TODO Auto-generated method stub if(isEmpty()){ throw new EmptyStackException(); } return element[front]; } @Override public Object getRearElement() { // TODO Auto-generated method stub if(isEmpty()){ throw new EmptyStackException(); } int r=0; if(rear>0){ r=rear-1; } else r=element.length-1; return element[r]; } @Override public void put(Object theElement) { // TODO Auto-generated method stub if((rear+1)%element.length==front){ Object newQueue[]=(Object[])Array.newInstance(element.getClass().getComponentType(), 2*element.length); if(front==0) System.arraycopy(element, front, newQueue, front, element.length-1); else{ System.arraycopy(element, front, newQueue, front, element.length-front); System.arraycopy(element, 0, newQueue, element.length, front-1); } rear=front+element.length; element=newQueue; element[rear-1]=theElement; } else{ element[rear]=theElement; rear=(rear+1)%element.length; } } @Override public Object remove() { // TODO Auto-generated method stub if(isEmpty()){ throw new EmptyStackException(); } Object removedElement=element[front]; front=(front+1)%element.length; return removedElement; } public String toString(){ StringBuilder s=new StringBuilder("["); if(front<rear){ for(int i=front;i<rear;i++){ s.append(element[i].toString()+","); } } else{ for(int i=front;i<element.length;i++){ s.append(element[i].toString()+","); } for(int i=0;i<rear;i++){ s.append(element[i].toString()+","); } } s.append("]"); if(!isEmpty()){ s.delete(s.length()-2,s.length()-1); } return s.toString(); }}
构造方法复杂度为O(n),put(),toString()方法复杂度为O(n),其余方法复杂度为O(1)。
2.链式实现
import java.util.EmptyStackException;class ChainNode{ Object element; ChainNode next; ChainNode(){} ChainNode(Object element){ this.element=element; } ChainNode(Object element,ChainNode next){ this.element=element; this.next=next; }}public class LinkedQueue implements Queue{ ChainNode front,rear; public LinkedQueue(int initialCapacity){} public LinkedQueue(){} @Override public boolean isEmpty() { // TODO Auto-generated method stub return front==null; } @Override public Object getFrontElement() { // TODO Auto-generated method stub if(isEmpty()){ throw new EmptyStackException(); } return front.element; } @Override public Object getRearElement() { // TODO Auto-generated method stub if(isEmpty()){ throw new EmptyStackException(); } return rear.element; } @Override public void put(Object theElement) { // TODO Auto-generated method stub ChainNode p=new ChainNode(theElement,null); if(front==null) front=p; else rear.next=p; rear=p; } @Override public Object remove() { // TODO Auto-generated method stub if(isEmpty()){ throw new EmptyStackException(); } Object removedElement=front.element; front=front.next; if(isEmpty()) rear=null; //enable garbage collection return removedElement; } public String toString(){ StringBuilder s=new StringBuilder("["); ChainNode p=front; while(p!=null){ s.append(p.element.toString()+","); p=p.next; } s.append("]"); if(!isEmpty()){ s.delete(s.length()-2,s.length()-1); } return s.toString(); } public static void main(String args[]){ LinkedQueue s=new LinkedQueue(); System.out.println(s.isEmpty()); for(int i=1;i<8;i++){ s.put(new Integer(i)); } System.out.println(s.isEmpty()); System.out.println(s.toString()); for(int i=1;i<6;i++){ s.remove(); } System.out.println(s.isEmpty()); System.out.println(s.toString()); for(int i=1;i<4;i++){ s.put(new Integer(i)); } System.out.println(s.toString()); for(int i=1;i<5;i++){ s.put(new Integer(i)); } System.out.println(s.toString()); for(int i=1;i<5;i++){ s.put(new Integer(i)); } System.out.println(s.toString()); System.out.println(s.getFrontElement()); System.out.println(s.getRearElement()); }}
toString()方法复杂度为O(n),其余方法复杂度为O(1)。
3.总结
用数组实现比链式实现的方法少用内存而且时间更快,但是如果存在多个堆栈或队列,而它们的长度总和是一定的,但每个数组的范围都差不多要到从0到它们的长度总和,这个时候使用链式实现方法要更好。
0 0
- 堆栈和队列的java实现
- Java 实现堆栈和队列
- 堆栈和队列的实现
- 堆栈和队列的实现
- java中堆栈和队列的实现方式
- java用链表实现堆栈和队列
- Java数组实现堆栈和队列
- 用双链表实现的堆栈和队列
- 堆栈,队列的实现
- python实现堆栈和队列
- python实现堆栈和队列
- 关于树的队列实现和堆栈实现的分析
- Java数据结构--------堆栈和队列
- java 数据结构----------堆栈和队列
- Java基础课程学习总结,使用LinkedList简单模拟队列数据结构和堆栈数据结构的实现
- 堆栈及队列的实现
- 【数据结构】堆栈、队列的原理及java实现
- Java 使用LinkedList实现堆栈、队列的效果
- java调用不在同一目录下的bat
- 数据结构例程——线性表的顺序查找
- c语言关于时间的两个函数
- A*算法证明
- bug---- storyBoardID 出现的报错 可能是没有clean
- 堆栈和队列的java实现
- android:修改PagerTabStrip中的背景颜色,标题字体的样式、颜色和图标以及指示条的颜色
- 【Android】安卓布局文件中xmlns属性
- self.navigationController.navigationItem 与 self.navigationItem 关系对比与分析
- PHP5踩坑记
- Android——适配器
- Win7(64Bit) 安装 PL/SQL Developer图解
- Fuel-OpenStack架构学习
- 我想对所有新程序员说的一些话