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 }

对于链表而言,其头插和头删的效率较高,所以设计栈时将进行操作的一端设计在链表的头部。

 

posted @ 2021-03-09 09:52  一帆小白  阅读(233)  评论(0编辑  收藏  举报