首页 > 代码库 > Java数组实现自定义栈

Java数组实现自定义栈

栈是一种“后进先出(LIFO)”的数据结构,最后压入的数据项总是位于栈顶的位置,下面是维基百科中对栈的定义:


堆栈英语:stack),也可直接称。台湾作堆叠,在计算机科学中,是一种特殊的串行形式的数据结构,它的特殊之处在于只能允许在链结串行或阵列的一端(称为堆叠顶端指标,英语:top)进行加入资料(英语:push)和输出资料(英语:pop)的运算。另外堆叠也可以用一维阵列或连结串行的形式来完成。堆叠的另外一个相对的操作方式称为伫列。


由于堆叠数据结构只允许在一端进行操作,因而按照后进先出(LIFO, Last In First Out)的原理运作。


堆叠数据结构使用两种基本操作:推入(push)和弹出(pop):

  • 推入:将数据放入堆叠的顶端(阵列形式或串行形式),堆叠顶端top指标加一。
  • 弹出:将顶端数据资料输出(回传),堆叠顶端资料减一。

实际应用:

a、在我们熟悉的图形化界面编程中,例如那种撤销操作,撤销最近一次执行的操作,大多数情况下就是使用栈这种特殊的数据结构来实现的,当然使用其他的方式也可以实现。

b、可以实现对一个字符串进行反转操作,当然这里是可以实现,但是并不推荐这样去做,实际上直接使用数组反序输出更加方便快捷,效率也更高。


1、首先我们先定义一个Stack Interface,我们把他定义成泛型的.

package com.stack;
/**
 * 栈接口
 * @author feizi
 * @time 2015-1-12下午3:23:32
 */
public interface StackInterface<E> {
	
	//获取堆栈长度
	public int size();
	
	//入栈
	public void push(E element) throws Exception;
	
	//出栈
	public E pop() throws Exception;
	
	//获取栈顶元素
	public E peek() throws Exception;
	
	//获取栈中元素个数
	public int getElementCount();
	
	//判断是否当前栈顶指针没有到达栈底
	public boolean hasMoreElement();
	
	//判断栈空
	public boolean isEmpty();
	
	//判断栈溢
	public boolean isFull();
	
	//清空栈
	public void clear();
}

2、然后,利用数组实现堆栈,

package com.stack;

import java.util.Arrays;

/**
 * 栈接口的具体实现类
 * @author feizi
 * @time 2015-1-12下午3:44:36
 */
public class ArrayStack<E> implements StackInterface<E> {

	private final int DEFAULT_SIZE = 3;//堆栈初始化时缺省大小
	private int maxSize;//堆栈的最大容量
	private E[] arrayObj;//数组
	
	private int top;//栈顶指针
	
	@SuppressWarnings("unchecked")
	public ArrayStack(){
		this.maxSize = DEFAULT_SIZE;
		this.arrayObj = (E[]) new Object[this.maxSize];
		top = -1;
	}
	
	@SuppressWarnings("unchecked")
	public ArrayStack(int size){
		this.maxSize = size;
		this.arrayObj = (E[]) new Object[this.maxSize];
		top = -1;
	}
	
	/**
	 * 获取堆栈长度
	 * @return
	 */
	public int size(){
		return this.maxSize;
	}
	
	/**
	 * 获取堆栈中元素个数
	 */
	public int getElementCount() {
		return this.top;
	}
	
	/**
	 * 入栈,
	 * @throws Exception 
	 */
	public void push(E element) throws Exception {
		if(null == element){
			throw new Exception("入栈的元素不能为空!");
		}
		if(isFull()){
			//如果栈满,就扩容
			extendSize();
			
			//或者如果不想扩容的话,可以在此处抛出异常
			//throw new Exception("栈满不能入栈!");
		}
		this.arrayObj[++top] = element;
	}

	/**
	 * 出栈
	 * @throws Exception 
	 */
	public E pop() throws Exception {
		if(isEmpty()){
			throw new Exception("栈空不能出栈");
		}
		
		//先保存栈顶元素
		E element = (E) arrayObj[top];
		//然后清空栈顶元素
		arrayObj[top] = null;
		//栈顶指针下移,栈中元素减少一个
		top--;
		return element;
		
		//或者
//		return (E) this.arrayObj[top--];
	}

	/**
	 * 获取栈顶元素,先判空
	 * @throws Exception 
	 */
	public E peek() throws Exception {
		if(isEmpty()){
			throw new Exception("栈为空!");
		}
		return (E) this.arrayObj[getElementCount()];
	}

	/**
	 * 判断是否当前栈顶指针没有到达栈底
	 */
	public boolean hasMoreElement() {
		return getElementCount() >= 0 ? true : false;
	}
	
	/**
	 * 扩容,通常是在栈满以后才会扩充
	 */
	@SuppressWarnings("unchecked")
	public void extendSize(){
		this.maxSize = this.maxSize + this.DEFAULT_SIZE;
		Object[] newArray = new Object[this.maxSize];
		
		//使用java.lang包中提供的system.arrcopy()方法复制数组
		System.arraycopy(arrayObj, 0, newArray, 0, arrayObj.length);
		//将原数组置空
		Arrays.fill(arrayObj, null);
		
		this.arrayObj = (E[]) newArray;
	}
	
	/**
	 * 判断栈空
	 */
	public boolean isEmpty() {
		return this.top == -1;
	}

	/**
	 * 判断栈溢
	 */
	public boolean isFull() {
		return this.top + 1 == this.maxSize;
	}

	/**
	 * 清空栈
	 */
	@SuppressWarnings("unchecked")
	public void clear() {
		//将数组置空
		Arrays.fill(arrayObj, null);
		//栈顶指针重置
		this.top = -1;
		this.maxSize = this.DEFAULT_SIZE;
		this.arrayObj = (E[]) new Object[this.maxSize];
	}
	
	public static void main(String[] args) throws Exception {
		StackInterface<Object> myStack = new ArrayStack<Object>();
		System.out.println("==栈的总容量:"+myStack.size());
		System.out.println("==堆栈的元素个数:"+myStack.getElementCount());
		
		myStack.push(1);
		myStack.push("root");
		myStack.push(2);
		myStack.push(3);
		myStack.push("admin");
		myStack.push(4);
		myStack.push("feizi");
		
		System.out.println("==栈的总容量:"+myStack.size());
		System.out.println("==堆栈的元素个数:"+myStack.getElementCount());
		System.out.println("栈顶元素为:"+myStack.peek());
		
		while (myStack.hasMoreElement()) {
			System.out.println("栈指针:"+myStack.getElementCount()+",栈元素:"+myStack.pop());
		}
		
		//清空栈
		myStack.clear();
		System.out.println("==栈的总容量:"+myStack.size());
		System.out.println("==堆栈的元素个数:"+myStack.getElementCount());
		
		while (myStack.hasMoreElement()) {
			System.out.println("================栈顶元素为:"+myStack.peek());
			System.out.println("栈指针:"+myStack.getElementCount()+",栈元素:"+myStack.pop());
		}
	}
}



Java数组实现自定义栈