动态数组——用数组倍增方法实现栈(java 实现)

栈的基本操作

以栈存储的数据是char类型为例:

  • void push(char)/boolean push(char) //压入一个数据
  • char pop() //删除并返回栈顶的元素
  • char top() //返回栈顶元素
  • int size() //返回数据个数
  • boolean isEmpty() //判断栈是否为空
  • boolean isStackFull() //判断栈是否已满

栈的实现代码

  • 当数组大小过小倍增数组(push函数中实现),大小过大倍减数组(pop函数中实现)。
  • 发现了pop编写过程中容易出现的几个错误,已经注释在代码中。
package stack;
//DAStack: Double Array Stack 倍增数组栈
public class DAStack {
    private char[] datas;
    int top,capacity;//容量
    
    public DAStack(){
    	top=-1;
    	capacity=1;
    	datas=new char[capacity];
    }
    public void push(char data){
    	top++;
    	if(top<capacity){
    		datas[top]=data;
    	}
    	else{
    		char[] copy=new char[capacity*2];
    		System.arraycopy(datas, 0, copy, 0, capacity);
    		copy[top]=data;
    		capacity=capacity*2;
    		datas=copy;
    	}//top=capacity
    }
    public char pop(){
    	if(top!=-1){
    		top--;
        	char topData= datas[top+1];
        	if((top+1)*2<=capacity&&capacity>1){/*一定注意容量到了1就不要继续缩减了 否则push中capacity*2失效*/
        		capacity=capacity/2;//先把容量缩减 否则容易犯错
        		char[] copy=new char[capacity];
        		System.arraycopy(datas, 0, copy, 0, capacity);
        		datas=copy;
        	}
        	return topData;
    	}
    	else return '!';//pop可能失败
    }/***************************此函数易错******************************/
    public char top(){
    	return datas[top];
    }
    public boolean isEmpty(){
    	return (top==-1);
    }
    public boolean isStackFull(){
    	return (top+1==capacity);
    }
}

全面测试

package stack;

public class TestDAStack {
	public static void main(String[] args){
		DAStack das=new DAStack();
		
	    System.out.print(das.isEmpty()+" ");
	    System.out.println(das.isStackFull());
	    //此时容量为1 无数据
	    das.push('f');
	    System.out.print(das.isEmpty()+" ");
	    System.out.println(das.isStackFull());
	    //此时容量为1 有1数据 栈满
	    das.push('d');
	    System.out.print(das.isEmpty()+" ");
	    System.out.println(das.isStackFull());
	    //此时容量倍增为2 有2数据 栈满
	    das.push('e');
	    System.out.print(das.isEmpty()+" ");
	    System.out.println(das.isStackFull());
	    //容量4 有3数据 不空不满
	    
	    for(int i=0;i<4;i++){
	    	System.out.print(das.pop()+" ");
	    	System.out.print(das.isEmpty()+" ");
		    System.out.println(das.isStackFull());
	    }
	} 
}

输出如下:
true false
false true
false true
false false
e false true
d false true
f true false
! true false

发布了14 篇原创文章 · 获赞 0 · 访问量 304

猜你喜欢

转载自blog.csdn.net/zmx1952822326/article/details/100786277
今日推荐