栈
栈的实现原理为线性表,特点是只允许在固定的一段进行数据的增加和删除操作,允许增加和删除的一段成为栈顶(top),另一端称为栈底(bottom)。
栈遵循先入后出的操作原则,即LIFO(last In First Out)。
栈的增加操作叫做压栈,在栈顶加入数据。 也叫进栈/入栈。
栈的删除操作叫做出栈,**在栈顶删除数据。**也叫弹栈。

压栈出栈变化形式
有一组数据为:A、B、C,将这组数据按照顺序放入栈中,那么A作为最先进栈的数据是否只能最后出栈呢?
其实不然,如下所示:
情况1: A、B、C全部进栈,那么出栈的的顺序为C、B、A.
情况2:A进,A出。B进,B出,C进,C出。出栈顺序为A、B、C。
情况3:A进,B进,B出,C进,C出,A出。出栈顺序为B、C、A。
情况4:A进,A出,B进,C进,C出,B出。出栈顺序为A、C、B。
情况5:A进,B进,B出,A出,C进,C出。出栈顺序为B、A、C。
也就是说:栈只对数据的增加和删除的位置进行了限制,并没有对数据进出的顺序进行限制。
栈的常用方法
| 返回值 | 方法 | 用途 |
|---|---|---|
| boolean | empty() | 判断栈是否为空 |
| E | peek() | 得到栈顶元素 |
| E | pop() | 弹出栈顶元素 |
| E | push(E item) | 将元素压入栈 |
| int | search(Object o) | 查找元素在栈中的位置,栈顶为1 |
同时,由于Stack类extends了Vector类,而Vector类又implements了List接口,所以,栈也可以使用List的相关方法。
栈的简单实现
1.栈可以利用顺序表实现,使用尾插+尾删的方法实现。
2.栈可以利用链表实现,建议使用头插法实现。
顺序表实现(顺序表)
import java.util.Arrays;
public class MyStack<E> {
private Object[] elem;//栈空间
private int useSize;//可用元素
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
//不带参数的构造方法
public MyStack(){
this.elem=DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
public MyStack(int capactity) {
if(capactity<0){
throw new IllegalArgumentException("初始化容量不能为负数");
}else if(capactity==0){
this.elem=new Object[0];
}else {
this.elem=new Object[capactity];
}
}
//判断栈容量是否满
private boolean isFull(){
return this.useSize==this.elem.length;
}
//判断栈是否为空
public boolean isEmpty(){
return this.useSize==0;
}
//扩容
private void copyOf(){
//如果栈空间为0,则空间大小初始化为5
if(this.useSize==0){
this.elem=Arrays.copyOf(this.elem,5);
return;
}
//栈空间扩为原来的2倍
this.elem= Arrays.copyOf(this.elem,2*this.useSize);
}
//进栈
public void push(E element){
//判断栈是否已满或是否为空,如果栈已满,扩容
if(isFull()||isEmpty()){
copyOf();
}
//进栈
this.elem[useSize]=element;
this.useSize++;
}
//删除栈顶元素
public E pop(){
//判断栈是否为空,如果为空抛出异常
if(isEmpty()){
throw new RuntimeException("栈为空!");
}
//出栈
Object oldVal=this.elem[useSize-1];
this.elem[useSize-1]=null;
this.useSize--;
//返回弹出栈的元素
return (E) oldVal;
}
//得到栈顶元素
public E peek(){
//判断栈是否为空,如果为空抛出异常
if(isEmpty()){
throw new RuntimeException("栈为空!");
}
//返回栈顶元素
return (E) this.elem[useSize-1];
}
//搜索元素得到位置,从栈顶开始向下数
public int search(E element){
int index=0;
for (int i = this.useSize-1; i >=0 ; i--) {
index++;
if(element.equals(this.elem[i])){
return index;
}
}
return -1;
}
}

被折叠的 条评论
为什么被折叠?



