来源于书籍《数据结构与算法(Java描述)》邓俊辉 著 机械工业出版社
栈
栈是存放对象的一种特殊容器,在插入与删除对象时,这种结构遵循后进先出(Last-in-first-out,LIFO)的原则⎯⎯也就是说,对象可以任意插入栈中,但每次取出的都是此前插入的最后一个对象。比如一摞椅子(如 图二.1 所示),只能将最顶端的椅子移出,也只能将新椅子放到最顶端⎯⎯这两种操作分别称作入栈(Push)和退栈(Pop)。
栈是最基本的数据结构之一,在实际应用中几乎无所不在。例如,网络浏览器会将用户最近访问过的地址组织为一个栈:用户每访问一个新页面,其地址就会被存放至栈顶;而用户每次按下“Back”按钮,最后一个被记录下的地址就会被清除掉。再如,当今主流的文本编辑器大都支持编辑操作的历史记录功能:用户的编辑操作会被依次记录在一个栈中;一旦出现误操作,用户只需按下“Undo”按钮,即可撤销最近一次操作并回到此前的编辑状态。
使用数组实现栈
public interface Stack {
int getSize();//返回栈的元素个数
boolean isEmpty();//判断栈是否为空
Object top() throws StackEmptyException;//取栈顶元素但不删除
Object pop() throws StackEmptyException;//出栈
void push(Object ele);//入栈
}
public class StackEmptyException extends RuntimeException{
public StackEmptyException(String err){
super(err);
}
}
public class StackFullException extends RuntimeException{
public StackFullException(String err){
super(err);
}
}
public class StackByArray implements Stack{
public static final int CAPACITY = 1024;//数组默认容量
protected int capacity;//实际容量
protected Object[] S;//元素数组
protected int top = -1;//栈顶元素位置
//按默认容量创建栈对象
public StackByArray(){
this(CAPACITY);
}
//按指定大小创建栈对象
public StackByArray(int size){
capacity=size;
S=new Object[capacity];
}
//取出当前栈的规模
@Override
public int getSize() {
return (top+1);
}
@Override
public boolean isEmpty() {
return (top<0);
}
@Override
public Object top() throws StackEmptyException {
if(isEmpty()){
throw new StackEmptyException("意外:栈为空");
}
return S[top];
}
@Override
public Object pop() throws StackEmptyException {
Object ele;
if(isEmpty()){
throw new StackEmptyException("意外:栈为空");
}
ele=S[top];
S[top--] = null;//S[top]=null;top=top-1;
return ele;
}
@Override
public void push(Object ele) {
if(capacity==getSize()){
throw new StackFullException("意外:栈溢出");
}
S[++top] = ele;//top=top+1;S[top]=ele;
}
public static void main(String[] args) {
StackByArray stackByArray=new StackByArray();
//利用栈进行数组倒置
int[] test={
0,1,2,3,4,5};
for (int i = 0; i < test.length; i++) {
stackByArray.push(test[i]);
}
for (int i = 0; i < test.length; i++) {
test[i]= (int) stackByArray.pop();
}
}
}