Java栈实现
栈数组实现一:优点:入栈和出栈速度快,缺点:长度有限(有时候这也不能算是个缺点)
public class Stack { private int top = -1; private Object[] objs; public Stack(int capacity) throws Exception{ if(capacity < 0) throw new Exception("Illegal capacity:"+capacity); objs = new Object[capacity]; } public void push(Object obj) throws Exception{ if(top == objs.length - 1) throw new Exception("Stack is full!"); objs[++top] = obj; } public Object pop() throws Exception{ if(top == -1) throw new Exception("Stack is empty!"); return objs[top--]; } public void dispaly(){ System.out.print("bottom -> top: | "); for(int i = 0 ; i <= top ; i++){ System.out.print(objs[i]+" | "); } System.out.print("\n"); } public static void main(String[] args) throws Exception{ Stack s = new Stack(2); s.push(1); s.push(2); s.dispaly(); System.out.println(s.pop()); s.dispaly(); s.push(99); s.dispaly(); s.push(99); } }
bottom -> top: | 1 | 2 | 2 bottom -> top: | 1 | bottom -> top: | 1 | 99 | Exception in thread "main" java.lang.Exception: Stack is full! at Stack.push(Stack.java:17) at Stack.main(Stack.java:44)
数据项入栈和出栈的时间复杂度都为常数O(1)
栈数组实现二:优点:无长度限制,缺点:入栈慢
import java.util.Arrays; public class UnboundedStack { private int top = -1; private Object[] objs; public UnboundedStack() throws Exception{ this(10); } public UnboundedStack(int capacity) throws Exception{ if(capacity < 0) throw new Exception("Illegal capacity:"+capacity); objs = new Object[capacity]; } public void push(Object obj){ if(top == objs.length - 1){ this.enlarge(); } objs[++top] = obj; } public Object pop() throws Exception{ if(top == -1) throw new Exception("Stack is empty!"); return objs[top--]; } private void enlarge(){ int num = objs.length/3; if(num == 0) num = 1; objs = Arrays.copyOf(objs, objs.length + num); } public void dispaly(){ System.out.print("bottom -> top: | "); for(int i = 0 ; i <= top ; i++){ System.out.print(objs[i]+" | "); } System.out.print("\n"); } public static void main(String[] args) throws Exception{ UnboundedStack us = new UnboundedStack(2); us.push(1); us.push(2); us.dispaly(); System.out.println(us.pop()); us.dispaly(); us.push(99); us.dispaly(); us.push(99); us.dispaly(); } }
bottom -> top: | 1 | 2 | 2 bottom -> top: | 1 | bottom -> top: | 1 | 99 | bottom -> top: | 1 | 99 | 99 |
由于该栈是由数组实现的,数组的长度是固定的,当栈空间不足时,必须将原数组数据复制到一个更长的数组中,考虑到入栈时或许需要进行数组复制,平均需要复制N/2个数据项,故入栈的时间复杂度为O(N),出栈的时间复杂度依然为O(1)
栈单链表实现:没有长度限制,并且出栈和入栈速度都很快
public class LinkedList { private class Data{ private Object obj; private Data next = null; Data(Object obj){ this.obj = obj; } } private Data first = null; public void insertFirst(Object obj){ Data data = new Data(obj); data.next = first; first = data; } public Object deleteFirst() throws Exception{ if(first == null) throw new Exception("empty!"); Data temp = first; first = first.next; return temp.obj; } public void display(){ if(first == null) System.out.println("empty"); System.out.print("top -> bottom : | "); Data cur = first; while(cur != null){ System.out.print(cur.obj.toString() + " | "); cur = cur.next; } System.out.print("\n"); } }
public class LinkedListStack { private LinkedList ll = new LinkedList(); public void push(Object obj){ ll.insertFirst(obj); } public Object pop() throws Exception{ return ll.deleteFirst(); } public void display(){ ll.display(); } public static void main(String[] args) throws Exception{ LinkedListStack lls = new LinkedListStack(); lls.push(1); lls.push(2); lls.push(3); lls.display(); System.out.println(lls.pop()); lls.display(); } }
top -> bottom : | 3 | 2 | 1 | 3 top -> bottom : | 2 | 1 |
数据项入栈和出栈的时间复杂度都为常数O(1)