用数组实现栈

这是在学习java数据结构和算法时写的一个用数组实现栈的程序。

具体功能有:能动态扩充栈的大小,而且当栈内元素少于整个栈容量的1/3的时候,栈就会缩小容量,减小内存消耗。

stack接口:

public interface Stack {
	public int getSize();//获取栈的大小
	public boolean isEmpty();//判断栈是否为空
	public Object top();//获取栈顶元素(不删除)
	public void push(Object ele);//入栈
	public Object pop();//出栈
}
Stack_Array类

public class Stack_Array implements Stack{
	private static int SIZEDEFAULT=10; //栈默认大小为10
	private int capacity;
	private Object[] s; 
	protected int num=0;//栈内元素数量
	public static void setSizeDefault(int size) throws NegativeArraySizeException{
		if(size < 0){
			throw new NegativeArraySizeException("The default size of stack is less than 0");
		}
		SIZEDEFAULT=size;
	}
	public Stack_Array(){
		s= new Object[SIZEDEFAULT];
		capacity=SIZEDEFAULT;
	}
	public Stack_Array(int size){
		s= new Object[size];
		capacity=size;
	}
	public int getSize() {
		// TODO Auto-generated method stub	
		return capacity;
	}
	/**
	 * 判断栈是否为空
	 */
	public boolean isEmpty() {
		// TODO Auto-generated method stub
		return num<= 0;
	}
	/**
	 *  获取栈顶元素
	 */
	public Object top() {
		// TODO Auto-generated method stub
		if(!isEmpty()){
			return s[num-1];
		}else{
			System.out.println("the stack is empty ,the top element is null !");
			return null;
		}
	}
	/**
	 * 往stack里添加元素
	 */
	public void push(Object ele) {
		// TODO Auto-generated method stub
		if(num+1>capacity){
			expend();
		}
		s[num++]=ele;
	}
	/**
	 * 扩大数组的大小
	 */
	private void expend(){//当栈容量不足以push的时候,扩大栈
		capacity=capacity*2;
		Object temp[]= new Object[capacity];
		System.arraycopy(s, 0, temp, 0, s.length);
		s=temp;
	}
	/**
	 * 缩小数组的大小
	 */
	private void narrow(){ 
		capacity=capacity/2;
		Object temp[]= new Object[capacity];
		System.arraycopy(s, 0, temp, 0, s.length/3);
		s=temp;
	}
	/**
	 * 从栈中取出数据,
	 */
	public Object pop() {
		// TODO Auto-generated method stub
		if(isEmpty()){
			System.out.println("the stack is empty ,it can't pop anything !");
			return null;
		}
		if(--num< capacity/3){//当栈内的数据少于栈大小的三分之一的时候,将栈减小,节省内存空间。
			narrow();
		}
		return s[num];
	}
}
工程下载 http://download.csdn.net/detail/a292643788/8080187

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值