定义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方法说明
- 输入n,建立可包含n个元素的ArrayIntegerStack对象
- 输入m个值,均入栈。每次入栈均打印入栈返回结果。
- 输出栈顶元素,输出是否为空,输出size
- 使用Arrays.toString()输出内部数组中的值。
- 输入x,然后出栈x次,每次出栈均打印。
- 输出栈顶元素,输出是否为空,输出size
- 使用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);
}
}