DoublingStackOfStrings(1308 P102)

本文介绍了Java中泛型的应用及迭代器的工作原理。通过一个具体的DoublingStackOfStrings类实例,展示了如何实现泛型与迭代器接口,以支持自定义的数据结构进行元素的增删查操作,并实现了特定的遍历顺序。

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

泛型的作用:任意类型
迭代器的作用:决定了历遍的顺序,就是for、while等循环的访问顺序、
比如这里的DoublingstackOfStrings继承了Iterable接口,返回的是一个迭代器,代码中实现了一个迭代器的class,

我们可以看到,Iterator接口是自从JDK1.2就出现的,需要实现Iterator的三个方法。而Iterable接口是JDK1.5之后才出现的,需要实现一个创建Iterator的方法。

而方法ArrayIterator()决定了DoublingstackOfStrings 对象的for-each访问顺序。(这里是逆序顺序)




代码:
ublic class DoublingStackOfStrings< Item> implements Iterable< Item> {

private Item[] a = ( Item[]) new Object[ 1];
private int n;

public int sieze(){
return n;
}

public boolean isEmpty(){
return n == 0;
}

public void push( Item item){
if ( n == a. length) resize( 2 * n);
a[ n++] = item;
}

public Item pop(){
Item item = a[-- n];
a[ n] = null;
if ( n > 0 && n == a. length/ 4) resize( a. length / 2);
return item;
}

public int arraySize(){
return a. length;
}

public void resize(int max){
Item[] temp = ( Item[]) new Object[max];
for (int i = 0; i < n; i ++){
temp[i] = a[i];
}
a = temp;
}

public Iterator< Item> iterator(){
return new ArrayIterator();
}

private class ArrayIterator implements Iterator< Item>{
private int i = n;
@Override
public boolean hasNext() {
return i > 0;
}

@Override
public Item next() {
return a[-- i];
}

@Override
public void remove() {

}
}

public static void main(String [] args){
DoublingStackOfStrings<String> strings = new DoublingStackOfStrings<>();
String[] inputs = StdIn. readAllStrings();

//这些注释掉的原因是:split()只能分割字符串,但是输入的有空格的话就为字符串数组,所以不能分割了。
//StdOut.println(inputs);
//String[] inputs = str.split(" ");

// for (String input : inputs){
// StdOut.println(input);
// }

// for (int i = 0; i < inputs.length; i ++){
// StdOut.println(inputs[i]);
// }

StdOut. print( "Srack pop content is : ");
for (String input : inputs){
if (input.equals( "-")){
if (strings.isEmpty()){
StdOut. println( "Stack overflow");
return;
}
else {
StdOut. print(strings.pop() + " "); //这里为什么不会改变,因为数组中存放的位置是不变的,迭代器只是改变了访问顺序
}
}else {
strings.push(input);
}
}
StdOut. println();
StdOut. println( "Stack size is : " + strings.arraySize());
StdOut. print( "Stack content is : ");
for (String string : strings){
StdOut. print(string + " ");
}
StdOut. println();
// for (int i = 0; i < strings.arraySize(); i ++){
// StdOut.println(strings.iterator().next());
// }

/*
这里强调一下:返回的数组大小一定为2的倍数,不能为奇数。
*/
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值