Java 用数组实现简单的栈功能

本文详细介绍了如何使用数组实现一个具备动态扩容能力的栈类Mystack。从类的结构设计,包括成员变量的定义,到核心功能如数据入栈、出栈、判空、获取栈顶数据等的实现,再到测试代码的编写,本文提供了全面的指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先 这个栈的类名为 Mystack;

public class MyStack{}

接着规定栈的基本结构:

  1. 需要一个空间存储数值,这里用数组来存储数据;
  2. 一个size变量 指示当前栈的大小;
  3. 一个top指针 始终指向栈顶,以便完成出栈入栈操作;
  4. 因为数组 有空间大小 所以需要一个MAX_SIZE来规定当前数组最大容量,防止发生数据溢出。
  5. 为了实现数组动态扩容增加一个addSize变量来记录每次扩容增加的空间。

综合上述要求 可以完成 Mystack类的成员变量

    private int value[];//存储数据,规定value[0]不存值,当top指向value[0]时表示栈空;
    private int size;//标记当前栈大小
    private int top;//始终指向栈顶
    private int MAX_size;//记录栈的最大容量
    private int addSize=10;//每次扩容 增加的栈的大小
    public MyStack() {//栈的初始化方法
        this.MAX_size=5;
        this.value = new int[this.MAX_size+1];//因为value[0]不存值,所以创建数组时需要多创建一个位置。
        this.size = 0;
        this.top = 0;
    }

然后实现栈的基本功能:

  1. 数组扩容
private void addArraySize(){
        MAX_size +=addSize;
        addSize*=2;//每次扩容后下次增加的空间加倍
        int[] temp = new int[MAX_size+1];//新建一个数组
        for (int i=0;i<=size;i++){//将原数组搬家到新数组 可以用Arrays.copyOf完成
            temp[i]=value[i];
        }
        value=temp;//使原数组指向新数组
    }
  1. 数据入栈(push)
    public void push(int number){//将数据存入数组,栈大小增加(size++)
        if (size+1>MAX_size){//如果比最大容量大 则先对数组扩容。
            addArraySize();
        }
            value[++top] = number;
            size++;
    }
  1. 栈判空
   public boolean isEmpty(){//判空规则为 当top指向栈顶则栈为空
        if (top==0)
            return true;
        else
            return false;
    }
  1. 数据出栈(pop)
    public int pop() throws Exception {//栈非空时,数据出栈 栈大小减一(size--) 否则抛出异常
        int result;
        if (!isEmpty()){
            result = value[top--];
            size--;
        }else {
            throw new Exception("stack is empty");
        }
        return result;
    }
  1. 获取栈顶数据(非出栈)
    public int getTop() throws Exception {//栈非空时,取栈顶数据
        if (!isEmpty())
            return value[top];
        else
            throw new Exception("stack is empty");
    }
  1. 获取当前栈的大小
	public int getSize() {
        return size;
    }
  1. 重写toString方法 方便测试
    public String toString(){//输出时,只输出有值的数据
        int temp[] = new int[size];
        for (int i=0;i<size;i++)
            temp[i]=value[size-i];
        return Arrays.toString(temp);
    }

至此 栈的基本功能就完成了

测试代码

public static void testMyStack() throws Exception {
        Scanner input = new Scanner(System.in);
        MyStack stack = new MyStack();
        int cas =0;
        while (cas!=5){
            System.out.println("1:入栈");
            System.out.println("2:出栈");
            System.out.println("3:显示当前栈中所有数据");
            System.out.println("4:获取栈顶数据");
            cas = input.nextInt();
            switch (cas){
                case 1:
                    int number = input.nextInt();
                    stack.push(number);break;
                case 2:
                    System.out.println(stack.pop());break;
                case 3:
                    System.out.println(stack.toString());break;
                case 4:
                    System.out.println("topValueis: "+stack.getTop()+" Size:"+stack.getSize());
            }
        }
    }

附上栈的完整代码

import java.util.Arrays;

// top=0表示栈空 0位置作为初始位置 不存值
public class MyStack {
    private int value[];//存储数据,规定value[0]不存值,当top指向value[0]时表示栈空;
    private int size;//标记当前栈大小
    private int top;//始终指向栈顶
    private int MAX_size;//记录栈的最大容量
    private int addSize=10;//每次扩容 增加的栈的大小
    public MyStack() {//栈的初始化方法
        this.MAX_size=5;
        this.value = new int[this.MAX_size+1];//因为value[0]不存值,所以创建数组时需要多创建一个位置。
        this.size = 0;
        this.top = 0;
    }

    public void push(int number){//将数据存入数组,栈大小增加(size++)
        if (size+1>MAX_size){//如果比最大容量大 则先对数组扩容。
            addArraySize();
        }
            value[++top] = number;
            size++;
    }
    public int pop() throws Exception {//栈非空时,数据出栈 栈大小减一(size--) 否则抛出异常
        int result;
        if (!isEmpty()){
            result = value[top--];
            size--;
        }else {
            throw new Exception("stack is empty");
        }
        return result;
    }

    public boolean isEmpty(){//判空规则为 当top指向栈顶则栈为空
        if (top==0)
            return true;
        else
            return false;
    }

    public int getTop() throws Exception {//栈非空时,取栈顶数据
        if (!isEmpty())
            return value[top];
        else
            throw new Exception("stack is empty");
    }



    private void addArraySize(){
        MAX_size +=addSize;
        addSize*=2;//每次扩容后下次增加的空间加倍
        int[] temp = new int[MAX_size+1];//新建一个数组
        for (int i=0;i<=size;i++){//将原数组搬家到新数组 可以用Arrays.copyOf完成
            temp[i]=value[i];
        }
        value=temp;//使原数组指向新数组
    }

    public String toString(){//输出时,只输出有值的数据
        int temp[] = new int[size];
        for (int i=0;i<size;i++)
            temp[i]=value[size-i];
        return Arrays.toString(temp);
    }


    public int getSize() {
        return size;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值