使用java实现顺序栈

之前就学过数据结构这门课,当时有用c/c++实现过线性表的顺序存储、单链表、双向链表、顺序栈、链栈、图等数据结构;学了java也有一段时间了,最近一直在为投简历求值而努力着,想着对于大公司来说,对于本科生的要求基本上都要熟悉或者掌握常用的数据结构以及算法,所以准备着重新用java实现一遍以前学过的、现在也很常用或者很常考的一些数据结构以及算法。如果大家在阅读的时候发现有什么不合理的地方,还请大家指正! 

                                        顺序栈的java实现

要求:
     * 1.设置一个常量:常量在默认构造的时候会用到,用来构造初始化长度的数组;
     * 2.设置三个变量,size:用来存储数组中元素的个数,capacity:用来存储数组的长度,incLength:用来存储栈每次增加的长度;
     * 3.设置一个数组,该数组用来存储元素;
     * 4.具备多个构造函数,一个初始化默认构造,默认存储大小为16;另一个为可以接收长度的构造等;
     * 5.提供如下几个功能:
     *      a.获取栈的大小(size)
     *      b.判断栈是否为空
     *      c.压栈(入栈)
     *      d.出栈(弹栈)
     *      e.取栈顶元素
     *      f.清空栈

java代码实现如下:

import java.util.Arrays;

public class SequenceStack<T> {

	/*
	 * 用java实现顺序栈
	 * */
	private int DEFAULT_LENGTH=16;//栈的默认长度
	private int size=0;//栈中的元素个数
	private int capacity;//存放栈的实际长度
	private Object[] elementData;
	private int incLength=0;//当栈的长度不够时每次增加的长度;
	
	//默认构造栈
	public SequenceStack(){
		capacity=DEFAULT_LENGTH;
		elementData=new Object[capacity];
	}
	
	//根据提供的长度构造栈
	public SequenceStack(int length){
		capacity=length;
		elementData=new Object[capacity];
	}
	
	//根据提供的长度构造栈并插入第一个元素
	public SequenceStack(T element,int length){
		capacity=length;
		elementData=new Object[capacity];
		elementData[0]=element;
		size++;
	}
	
	//根据提供的长度构造栈,并指定每次增加的长度
	public SequenceStack(int length,int incLength){
		this.capacity=length;
		this.incLength=incLength;
		elementData=new Object[capacity];
	}
	
	//返回栈的元素个数
	public int size(){
		return this.size;
	}
	
	//判断栈是否为空
	public boolean isEmpty(){
		return size==0;
	}
	
	//判断栈的长度是否足够
	private void ensureCapacity(int length){
		//如果栈的长度小于压栈后的长度,则需要新增栈的长度
		if(capacity<length){
			if(incLength>0){//如果IncLength的值>0,则用原有的incLength的值来增加
				while(capacity<length){
					capacity+=incLength;
				}
			}
			else{//否则的话每次将capacity*2;
				while(capacity<length){
					capacity<<=1;
				}			
			}
			//将栈中的元素复制到新的栈中
			elementData=Arrays.copyOf(elementData,capacity);
		}
	}
	
	//压栈(入栈)
	public void push(T element){
		ensureCapacity(size+1);
		elementData[size]=element;
		size++;
	}
	
	//出栈(弹栈)
	@SuppressWarnings("unchecked")
	public T pop(){
		
		if(size==0){
			return null;
		}	
		T oldValue=(T) elementData[size-1];
		elementData[size-1]=null;
		size--;
		return oldValue;	
	}
	
	//取栈顶元素
	@SuppressWarnings("unchecked")
	public T get(){
		if(size==0){
			return null;
		}
		return (T)elementData[size-1];
	}
	
	//清空栈
	public void clear(){
		for(int i=0;i<size;i++){
			elementData[i]=null;
		}
		size=0;
	}
	
	public String toString(){
		if(size==0){
			return "[]";
		}else{
			String s="[";
			for(int i=0;i<size;i++){
				if(i<size-1){
					s+=elementData[i]+",";
				}else{
					s+=elementData[i]+"]";
				}
			}
			return s;
		}
	}
}

接下来是链栈,加油!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值