栈的定义:(特殊的线性表)
仅在表的一端进行插入和删除的线性表。允许插入、删除的这一端称为栈顶,另一端称为栈底。表中没有元素时称为空栈。
被称为后进先出的线性表(Last In First Out),简称 LIFO表,或被称为先进后出的线性表(First In Last Out),简称 FILO表。
栈更具存储方式的不同分为两种:顺序栈和链栈。
顺序栈:
- 和顺序表一样,顺序栈也采用数组来存放数据元素;
- 为了保证栈底位置的不变,采用数组下标为0的位置作为顺序栈的栈底。
- 而栈顶指针的最大值为capacity(栈的容量)-1;
- 当栈为空栈时,采用栈顶指针指向-1表示。
下面借图(来自http://www.nowamagic.net/librarys/veda/detail/2271)演示一下:
对于顺序栈,数据元素的进栈操作解释如下:
- 栈顶指针top先自增1,给需要进栈的元素腾出内存空间;
- 然后给top对应的数组元素赋值,data[top] = e。size加1
出栈的操作则相反,如下:
- 先获得栈顶指针对应的数组元素的值;
- 然后栈顶指针top减1。size减1
下面是我的Java代码实现:
package com.phn.stack;
/**
* @author 潘海南
* @Email 1016593477@qq.com
* @TODO 顺序栈
* @date 2015年7月20日
*/
public class FOArrayStack<E> {
//初始化默认栈的存储容量
private static final int DEFUALT_CAPACITY = 100;
//栈中存储数据元素的数组
private Object[] data = null;
//栈的实际大小
private int size;
//栈的栈顶指针
private int top;
//栈的实际容量
private int capacity;
/**
* @TODO 无参构造函数,初始化栈
*/
public FOArrayStack(){
this(DEFUALT_CAPACITY);
}
/**
* @TODO 带参构造函数,初始化栈
* @param initialCapacity 初始化栈的容量
*/
public FOArrayStack(int initialCapacity) {
this.capacity = initialCapacity;
this.data = new Object[initialCapacity];
this.size = 0;
this.top = this.size-1;
}
/**
* @TODO 压入数据元素到栈中
* @param e 数据元素
* @return