栈是一种线性表,仅限在一端进行插入和删除操作,特点是先进后出。
由于栈是一种线性结构,首先可以想到用数组来实现,但由于数组初始化后容量就已经确定,如果不添加扩容操作,则会出现栈溢出,同时扩容操作也会降低一些效率;如果事先九分配较大空间则可能造成资源浪费。一种解决方法是同一个数组实现两个栈,让两个栈向数组中心延伸,当两个栈底元素相遇则溢出,虽然空间利用率大于数组长度的一半,但仍不理想。
另一种实现方法则是链表实现,链表实现可以避免数组实现的各项问题。
栈的基本操作接口
1 public interface StackMethods { 2 Stack initStack(Stack stack);//栈的初始化 3 Object getTop() throws Exception;//获取栈顶 4 void push(Object data);//入栈 5 public Object pop() throws Exception;//出栈 6 void clearStack();//清空栈内元素 7 boolean isStackEmpty(); 8 int stackLength(); 9 }
栈的实体类
1 public class Stack { 2 3 public Object data; 4 public Stack next; 5 public Stack( Object data) { 6 this.data = data; 7 } 8 9 10 }
栈基本操作方法的具体实现类SimpleStack
1 public class SimpleStack implements StackMethods { 2 private Stack first = null; 3 4 @Override 5 public Stack initStack(Stack stack) { 6 7 return null; 8 } 9 /** 10 * 返回站定元素 11 */ 12 @Override 13 public Object getTop() throws Exception{ 14 if( first == null) throw new Exception("empty!"); 15 return first.data; 16 } 17 /** 18 * 入栈 19 */ 20 @Override 21 public void push(Object data) { 22 Stack stack = new Stack(data); 23 stack.next = first; 24 first = stack; 25 } 26 /** 27 * 出栈 28 */ 29 @Override 30 public Object pop() throws Exception{ 31 if( first == null) throw new Exception("empty!"); 32 Object data = first.data; 33 first = first.next; 34 return data; 35 } 36 /** 37 * 清空栈 38 */ 39 @Override 40 public void clearStack() { 41 while(first != null){ 42 first = first.next; 43 } 44 45 } 46 47 @Override 48 public boolean isStackEmpty() { 49 return first == null; 50 } 51 52 @Override 53 public int stackLength() { 54 int i = 0; 55 while(first != null) i++; 56 return i; 57 } 58 public static void main(String[] args) throws Exception{ 59 SimpleStack s = new SimpleStack(); 60 for(int i=0; i<10; i++){ 61 s.push(i); 62 System.out.println(s.getTop()+""); 63 } 64 65 while(!s.isStackEmpty()){ 66 System.out.println(s.pop()+""); 67 } 68 69 } 70 71 72 73 }