栈结构 --- java实现

1 栈 相关的特点

从数据的逻辑结构来看,栈结构其实就是一种线性结构,在栈结构中,只有栈顶元素是可以访问的,
一般栈结构的基本操作有两个,入栈(Push)和出栈(Pop)

  • 入栈(Push):将数据保存到栈顶的操作,进行入栈操作前,先修改栈顶引用,使其向上移动一个元素位置,然后将数据保存到栈顶引用
    所指的位置
  • 出栈(Pop):将栈顶的数据弹出的操作,通过修改栈顶引用,使其指向栈中的下一个元素,

其特点:“后进先出”的原则处理节点数据

2 代码实现

2.1 准备工作

public class Data2 {
    String name;
    int age;
}
  • 创建栈的数据结构
public class StackType {
    static final int Max = 50;
    Data2[] data2 = new Data2[Max + 1]; // 数据元素 从下标 1 开始记录数据节点,下标为 0 的位置不使用
    int top; //栈顶
}

2.2 初始化栈

    //栈的初始化,栈顶元素设置为 0
    StackType STInit() {
        StackType p;
        if ((p = new StackType()) != null) {
            p.top = 0;
            return p;
        } else {
            return null;
        }
    }

2.3 判断栈是否为空

    //判断是否为空栈
    boolean STIsEmpty(StackType s) {
        if (s.top == 0) {
            return false;
        } else {
            return true;
        }
    }

2.4 判断栈是否已满

    //判断是否已满
    boolean STIsFull(StackType s) {
        if (s.top == Max) {
            return true;
        } else {
            return false;
        }
    }

2.5 清空栈中的元素

    //清空栈中的元素
    void STClear(StackType s) {
        s.top = 0;
    }

2.6 释放空间

    /**
     * 释放空间,在初始化栈结构时,使用malloc函数分配内存空间,虽然可以使用清空栈
     * 操作,但是清空栈操作并没有释放内存空间,这就需要使用free函数释放所分配的内存
     */
    void STFree(StackType s) {
        if (s != null) {
            s = null;//置空
        }
    }

2.7 入栈

    /**
     * 入栈操作步骤
     * 1 : 首先判断栈顶top,如果top大于等于Max 则表示溢出
     * 2 : 设置top = top + 1
     * 3 : 将入栈元素保存到top指向的位置
     */
    int PushST(StackType s, Data2 data2) {
        if ((s.top + 1) > Max) {
            System.out.println("栈溢出");
            return 0; //代表失败
        } else {
            s.data2[++s.top] = data2;
            return 1; //代表成功
        }
    }

2.8 出栈操作

    /**
     * 出栈操作步骤
     * 1 : 判断栈顶top 如果top等于0,则表示为空栈
     * 2 : 将栈顶引用top所指向位置的元素返回
     * 3 : 设置top = top - 1
     */
    Data2 PopST(StackType s) {
        if (s.top == 0) {
            System.out.println("栈为空");
            System.exit(0);
        }
        return s.data2[s.top --];
    }

2.9 读取节点操作

    /** 读取节点数据的操作和出栈操作不同,读取节点数据的操作仅显示栈顶节点数据的内容
     *  出栈操作则将栈顶数据弹出,该数据不再存在
     */
    Data2 PeekST(StackType s){
        if (s.top == 0){
            System.out.println("栈为空");
            System.exit(0);
        }
        return s.data2[s.top];
    }
}

3测试

public class MyTest {
    public static void main(String[] args) {

        StackType st = new StackType();
        Data2 data1 = new Data2();

        //初始化栈
        StackType stack = st.STInit();
        System.out.println("初始化栈完毕");

        //入栈操作
        Scanner sc = new Scanner(System.in);
        System.out.println("入栈操作开始执行");
        System.out.println("输入姓名 年龄 进行入栈操作,如果输入 0 代表停止输入");

        do {
            Data2 data = new Data2();
            data.name = sc.next();
            if (data.name.equals("0")) {
                break;
            } else {
                data.age = sc.nextInt();
                st.PushST(stack, data);
            }
        }while (true);

        String temp = "1";
        System.out.println("出栈操作: 按任意非0键进行出栈操作");
        temp = sc.next();
        while (!temp.equals("0")) {
            data1 = st.PopST(stack);
            System.out.println("出栈的数据是:" + "(" + data1.name + ":" + data1.age + ")");
            temp = sc.next();
        }
        System.out.println("测试结束!");
        st.STFree(st);
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值