数据结构:手动编写Java栈

来源:互联网 发布:用在淘宝上的比价神器' 编辑:程序博客网 时间:2024/06/08 14:14

  • 栈是存放对象的一种特殊容器,在插入与删除对象时,这种结构遵循后进先出(last-in-first-out, LIFO)的原则

栈ADT

作为一种抽象数据类型(ADT),栈必须支持下列的基本方法:

  • push():将对象压至栈顶,并输出栈顶对象
  • pop():若栈非空,则将栈顶元素移除,并将其返回;否则,报错
  • getSize():返回栈内当前对象的数目
  • isEmpty():检查栈是否为空
  • top():若栈非空,则返回栈顶对象(但并不移除);否则,报错

异常

Java抽象数据类型的实现过程通常可以分为两步。首先,要给出期应用程序接口(API),接口的作用就是明确ADT所支持的方法的名称、声明和调用的形式。此外还要针对各种可能出现的错误条件,定义相应的异常

  • 定义ExceptionStackEmpty异常——在对空战应用pop()或top()方法时,这一异常就会被抛出,以报告错误
package com.stack;/** * 定义ExceptionStackEmpty异常——在对空战应用pop()或top()方法时,这一异常就会被抛出,以报告错误 * @author Vinsmoke * */public class ExceptionStackEmpty extends RuntimeException{    public ExceptionStackEmpty(String err){        super(err);    }}

Stack接口

package com.stack;/** * 栈接口的定义 * 对一些操作需要抛出异常 * @author Vinsmoke * */public interface Stack {    public int getSize();                            //返回栈中的元素数目    public boolean isEmpty();                        //判断栈是否为空    public Object top() throws ExceptionStackEmpty;  //取栈顶元素(但不删除)    public void push(Object e);                      //入栈    public Object pop() throws ExceptionStackEmpty;  //出栈}

基于数组的简单实现

package com.stack;import java.util.Arrays;/** * 借助定长数组以及数组扩容实现Stack接口 * 由于Java数组的元素都是从0开始编号,所以top必须初始化为-1;反过来,只要top=-1,就说明栈为空 * @author Vinsmoke * */public class Stack_Array implements Stack{    public static final int CAPACITY=1024;    //数组的默认容量    protected int capacity;                   //数组的实际容量    protected Object[] s;                     //对象数组    protected int top=-1;                     //栈顶元素的位置,数组索引值    //构造方法一:按默认容量创建栈对象    public Stack_Array(){        this(CAPACITY);   //调用构造方法二    }    //构造方法二:按指定容量创建对象    public Stack_Array(int capacity) {        this.capacity=capacity;        s=new Object[capacity];    }    //获取当前栈的规模,即已有元素个数    @Override    public int getSize() {        return (top+1);    }    //测试栈是否为空    @Override    public boolean isEmpty() {        return (top<0);    }    //取栈顶元素    @Override    public Object top() throws ExceptionStackEmpty {        if(isEmpty())            throw new ExceptionStackEmpty("异常:栈空");        return s[top];    }    //入栈    @Override    public void push(Object e) {        //检测是否需要扩容        if((top+1)>=capacity){            Object[] temp=new Object[capacity+(capacity>>1)];            for(int i=0; i<temp.length; i++)                if(i<s.length)                    temp[i]=s[i];                else                    temp[i]=null;                  //空对象            s=temp;            capacity=capacity+(capacity>>1);       //Attention:capacity的值需要变化        }        s[++top]=e;    }    //出栈    @Override    public Object pop() throws ExceptionStackEmpty {        Object elem;        if(isEmpty())            throw new ExceptionStackEmpty("异常:栈空");        elem=s[top];        s[top--]=null;       //置空        return elem;    }}

测试

package com.stack;public class Test {    public static void main(String[] args) {        Stack_Array s=new Stack_Array(5);    //初始5个元素容量的栈        for(int i=0; i<12; i++)            s.push(i);        System.out.println("栈的实际容量:"+s.capacity);        System.out.println("栈顶元素的位置(索引值):"+s.top);        while(!s.isEmpty()){            System.out.print(s.pop()+"  ");        }    }}

运行结果

栈的实际容量:15栈顶元素的位置(索引值):1111  10  9  8  7  6  5  4  3  2  1  0 
原创粉丝点击