5.3 jmu-Java-04面向对象进阶-03-接口-自定义接口ArrayIntegerStack

本文介绍了如何在Java中实现IntegerStack接口,以及使用ArrayIntegerStack类实现栈操作,包括数组和ArrayList两种方式,并展示了相关测试用例和思考过程。
摘要由CSDN通过智能技术生成

定义IntegerStack接口,用于声明一个存放Integer元素的栈的常见方法:

public Integer push(Integer item);
//如果item为null,则不入栈直接返回null。如果栈满,也返回null。如果插入成功,返回item。

public Integer pop();   //出栈,如果为空,则返回null。出栈时只移动栈顶指针,相应位置不置为null
public Integer peek();  //获得栈顶元素,如果为空,则返回null.
public boolean empty(); //如果为空返回true
public int size();      //返回栈中元素个数

定义IntegerStack的实现类ArrayIntegerStack,内部使用数组实现。创建时,可指定内部数组大小。

main方法说明

  1. 输入n,建立可包含n个元素的ArrayIntegerStack对象
  2. 输入m个值,均入栈。每次入栈均打印入栈返回结果。
  3. 输出栈顶元素,输出是否为空,输出size
  4. 使用Arrays.toString()输出内部数组中的值。
  5. 输入x,然后出栈x次,每次出栈均打印。
  6. 输出栈顶元素,输出是否为空,输出size
  7. 使用Arrays.toString()输出内部数组中的值。

思考

如果IntegerStack接口的实现类内部使用ArrayList来存储元素,怎么实现?测试代码需要进行什么修改?

输入样例

5
3
1 2 3
2

输出样例

1
2
3
3,false,3
[1, 2, 3, null, null]
3
2
1,false,1
[1, 2, 3, null, null]

思路分析:

这个题目要求我们在Java中实现一个名为IntegerStack的接口和一个实现该接口的类ArrayIntegerStack。IntegerStack接口定义了一些栈操作的方法,包括push、pop、peek、empty和size。ArrayIntegerStack类使用数组来实现这些方法,并在创建时可以指定数组的大小。
在ArrayIntegerStack类中,可以使用一个Integer数组stack来存储栈中的元素,和一个int类型的top来表示栈顶的位置。push方法用于将一个元素压入栈顶,如果元素为null或者栈已满,则返回null,否则返回压入的元素。pop方法用于弹出栈顶的元素,如果栈为空,则返回null,否则返回弹出的元素。peek方法用于获取栈顶的元素,如果栈为空,则返回null,否则返回栈顶的元素。empty方法用于检查栈是否为空,如果为空则返回true,否则返回false。size方法用于返回栈中的元素个数。
然后,如果要使用ArrayList来实现IntegerStack接口,只需要在ArrayIntegerStack类中将数组替换为ArrayList,并相应地修改push、pop、peek、empty和size方法。测试代码需要修改的地方主要是在创建ArrayIntegerStack对象时,不再需要指定数组的大小,因为ArrayList的大小是动态的。

代码实现:

import java.util.Arrays;
import java.util.Scanner;

// 定义一个接口 IntegerStack,用于实现整数栈的相关操作
interface IntegerStack {
    Integer push(Integer item);// 入栈操作
    Integer pop();// 出栈操作
    Integer peek();// 查看栈顶元素
    boolean empty();// 判断栈是否为空
    int size();// 获取栈的大小
}

// 实现 IntegerStack 接口的 ArrayIntegerStack 类
class ArrayIntegerStack implements IntegerStack {
    private Integer[] stack;// 用于存储整数的数组
    private int top;// 栈顶指针

    // 构造函数,根据传入的栈大小初始化数组和指针
    public ArrayIntegerStack(int size) {
        stack = new Integer[size];
        top = -1;
    }

    // 入栈操作,如果传入的 item 为 null 或栈满,返回 null,否则将 item 入栈并返回 item
    public Integer push(Integer item) {
        if (item == null || top == stack.length - 1) {
            return null;
        }
        stack[++top] = item;
        return item;
    }

    // 出栈操作,如果栈为空,返回 null,否则返回栈顶元素并将其出栈
    public Integer pop() {
        return top == -1 ? null : stack[top--];
    }

    // 查看栈顶元素,如果栈为空,返回 null,否则返回栈顶元素
    public Integer peek() {
        return top == -1 ? null : stack[top];
    }

    // 判断栈是否为空,如果栈为空,返回 true,否则返回 false
    public boolean empty() {
        return top == -1;
    }

    // 获取栈的大小,即栈中元素的个数
    public int size() {
        return top + 1;
    }

    // 将栈转换为字符串并返回
    public String toString() {
        return Arrays.toString(stack);
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 读取栈的大小 n
        int n = scanner.nextInt();
        // 创建一个 ArrayIntegerStack 对象,初始化大小为 n
        ArrayIntegerStack ais = new ArrayIntegerStack(n);
        // 读取操作的次数 m
        int m = scanner.nextInt();
        // 循环 m 次,进行入栈操作
        while (m-- > 0) {
            int item = scanner.nextInt();
            System.out.println(ais.push(item));
        }
        // 输出栈顶元素、栈是否为空、栈大小
        System.out.println(ais.peek() + "," + ais.empty() + "," + ais.size());
        // 输出栈的内容
        System.out.println(ais);
        // 读取弹出操作的次数 x
        int x = scanner.nextInt();
        // 循环 x 次,进行出栈操作
        while (x-- > 0) {
            System.out.println(ais.pop());
        }
        // 输出栈顶元素、栈是否为空、栈大小
        System.out.println(ais.peek() + "," + ais.empty() + "," + ais.size());
        // 输出栈的内容
        System.out.println(ais);
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值