Java之栈的实现
栈和队列都是顺序表,只是对其插入和删除操作进行了限制,在栈中,只能在线性表的一端进行插入和删除操作,因此有了我们熟知的先入后出的特性。
1、用顺序表实现栈
1 public class MyStack { 2 3 // 顺序表类型的栈 4 private int[] data = new int[100]; 5 private int size = 0; 6 // 基本操作 7 // 1、入栈 8 public void push(int value){ 9 if(size >= data.length){ 10 int[] newdata = new int[size+15]; 11 for(int i = 0; i<data.length;i++){ 12 newdata[i] = data[i]; 13 } 14 data = newdata; 15 } 16 data[size] = value; 17 size++; 18 } 19 // 2、出栈 20 public Integer pop(){ 21 if(size == 0){ 22 return null; 23 } 24 size--; 25 return data[size]; 26 } 27 // 3、取栈顶 28 public Integer top(){ 29 if(size == 0) 30 return null; 31 return data[size-1]; 32 } 33 }
在顺序表中,由于顺序表的头插和头删的效率非常地下,而尾插和尾删的效率较高,所以将栈顶设置在顺序表的尾部。利用一个size可以快速的获得第一个元素的下标。其时间复杂度均为O(1)。
1 class SNode { 2 int val; 3 SNode next; 4 SNode(int data){ 5 this.next = null; 6 this.val = data; 7 } 8 } 9 10 public class MyStack { 11 12 private SNode head = null; 13 public void push(int data){ 14 SNode tmp = new SNode(data); 15 tmp.next = head; 16 head = tmp; 17 } 18 public Integer pop(){ 19 if(head == null) 20 return null; 21 int tmp = head.val; 22 head = head.next; 23 return tmp; 24 } 25 public Integer top(){ 26 if(head == null) 27 return null; 28 return head.val; 29 } 30 31 }
对于链表而言,其头插和头删的效率较高,所以设计栈时将进行操作的一端设计在链表的头部。