Java当中给我们提供了一系列的栈的使用方法,
方法 | 功能 |
---|---|
Stack() | 构造一个空的栈 |
E push(E e) | 将e入栈,并返回e |
E pop() | 将栈顶元素出栈并返回 |
E peek() | 获取栈顶元素 |
int size() | 获取栈中有效元素个数 |
boolean empty() | 检测栈是否为空 |
其中pop()会将栈顶元素取出后删除,但peek()只获取栈顶元素 不会删除
那么我们是否可以将栈给模拟实现呢?
在实现栈的基本操作时,要定义好栈内的成员变量,
1. 栈内成员
public class MyStack {int usedSize;//栈内有效数据个数int[] elme;//栈的底层是用数组实现的,所以用数组来存放栈内成员//给定一个构造方法,初始化栈容量为10public MyStack(int[] elme) {elme= new int [10];}
}
在定义了栈内的成员变量后,我们可以来编写成员方法来实现栈的基本操作了
2. 入栈
public void push(int data){elme[usedSize]=data;}
3. 出栈
public int pop(){int oldval=elme[usedSize-1];usedSize--;return oldval;}
4. 取栈顶元素
public int peek(){return elme[usedSize-1];}
5. 栈的扩容
public void ensureCapacity(){if(usedSize==elme.length){elme= Arrays.copyOf(elme,usedSize*2);}}
模拟实现栈后,我们来思考一个问题??
根据
栈的特点 先进后出
我们可以得到栈无论是取栈顶元素还是入栈,时间复杂度都是O(1).
我们思考能否使用链表来实现栈呢??
1.若用单链表实现栈
,那么栈的头插,去头节点元素时间复杂度O(1),尾插,取尾节点元素时间复杂度O(n)
2.若使用双向链表实现栈
,头插,去头节点元素,尾插,取尾节点元素时间复杂度O(1)
所有在使用链表实现栈时,我们更推荐使用双向链表