最近总有朋友问我,为什么写的算法使用的是lee.tools包下的栈和队列。 为了好玩啊,JAVA是有一套集合框架,实现了栈,队列,集合,优先队列等常用的数据结构,但为了掌握这些工具的使用,最好的方法就是自己写一套。公布一下lee.tools的代码
lee.tools.ArrayStack; lee.tools.CircleQueue; lee.tools.LinkedStack; lee.tools.Queue; lee.tools.Stack; lee.tools.UF;
先定义一下栈的API, 栈有两个实现――链栈,顺序栈
package lee.tools; public interface Stack{ public boolean isEmpty(); //判断是否为空 public T pop(); //弹出 public void push(T key); //压入 public boolean isFull(); //判断是否栈满 public T peep(); //查看栈顶元素 }
链栈实现:
package lee.tools; public class LinkedQueueimplements Queue { Node head; Node tail; int size; public boolean isEmpty(){ if(head==null){ return true; } else{ return false; } } public void enQuene(T data){ if(head==null){ head = new Node (data); tail=head; } else{ tail.next=new Node (data); tail = tail.next; } } public T deQueue(){ if(!isEmpty()){ T temp =head.data; head = head.next; return temp; } else return null; } class Node { T data; Node next; Node(T d){ data = d; } } }
顺序栈的实现:
package lee.tools; public class ArrayStackimplements Stack { T arr[]; int size; int top; @SuppressWarnings("unchecked") public ArrayStack(){ size = 5; arr = (T[]) new Object[size]; top=-1; } @Override public boolean isEmpty() { if(top==-1){ return true; } else{ return false; } } @Override public T pop() { if(isEmpty()){ System.out.println("error! Stack is empty"); return null; } return arr[top--]; } @Override public void push(T key) { if(isFull()){ enLargeStack(); } arr[++top] = key; } @Override public boolean isFull() { if(top == size-1){ return true; } return false; } public void enLargeStack(){ @SuppressWarnings("unchecked") T[] newArr = (T[]) new Object[size*2]; size = size*2; for(int i=0;i