Java下压栈实现-可调整数组大小(p88)
来源:互联网 发布:天气预报数据来源 编辑:程序博客网 时间:2024/04/27 22:12
声明:
主要代码参考自算法(第四版),这里将代码列出,是想和大家交流一些学习心得。
1.前言
先说个小疑问
我们知道集合想要实现迭代,就必须实现Iterable接口,然后重写iterator()方法,从而返回Iterator对象,最后再利用Iterator对象的hasNext()方法和next()方法实现迭代,那么为什么不直接实现Iterator接口呢?
原因是:
因为Iterator接口的核心方法next()或者hasNext() 是依赖于迭代器的当前迭代位置的。 如果Collection直接实现Iterator接口,势必导致集合对象中包含当前迭代位置的数据(指针)。 当集合在不同方法间被传递时,由于当前迭代位置不可预置,那么next()方法的结果会变成不可预知。 除非再为Iterator接口添加一个reset()方法,用来重置当前迭代位置。但即时这样,Collection也只能同时存在一个当前迭代位置,而Iterable则不然,每次调用都会返回一个从头开始计数的迭代器,多个迭代器是互不干扰的。(引用自:http://blog.csdn.net/aa8568849/article/details/52650452)
好,那么就构建一下实现下压栈的思路。
2.思路
2.1
定义成员属性和基本方法
成员属性:
包括数组的创建和数组中元素的数量
2.2
创建下压栈类并实现Iterable接口,并且实现iterator()方法,用于返回Iterator对象。
2.3
创建内部类并实现Iterator接口,并实现hasNext()和next()方法,这样就可以实现迭代。
2.4
定义调整数组大小的方法
2.5
定义压栈和弹栈的方法
3.代码
3.1
定义成员属性和基本方法:
这里设定了数组的初始大小为1.
注:
Java中不允许创建泛型数组,所以这里创建Object类型的,然后再强转。
3.2
创建下压栈类并实现Iterable接口:
实现iterator()方法:
3.3
创建内部类并实现Iterator接口,并实现hasNext()和next()方法:
注:
next()先输出栈顶元素。
3.4
定义调整数组大小的方法。
3.5
定义压栈和弹栈的方法:
4.完整代码
import java.util.ArrayList;import java.util.Iterator;//用数组实现的栈(可以调整栈的大小) p88//集合想要迭代的话需满足两个条件 1.返回Iterator对象 2.Iterator类包含hasNext()和next()public class ResizingArrayStack<Item> implements Iterable<Item> { Item[] a = (Item[]) new Object[1]; //数组装载栈元素 private int N = 0; //集合中的元素数量 //返回数组是否为空 public boolean isEmpty(){ return N == 0; } //返回栈中元素的数量 public int size(){ return N; } //调整数组的大小 public void resize(int newSize){ //将栈中的元素移动到新的大小为newSize的数组中 Item[] temp = (Item[]) new Object[newSize]; for(int i=0; i<N; i++) temp[i] = a[i]; a = temp; //引用指向新数组 } //压栈操作,将元素添加到栈顶 public void push(Item item){ //数组若满,则创建新数组(大小为原来2倍) if(N == a.length) resize(2*a.length); a[N++] = item; } //弹栈操作,将元素从栈顶移除 public Item pop(){ //获得栈顶元素 Item item = a[--N]; //同时使N值减1 a[N] = null; //避免对象游离 if(N>0 && N == a.length/4) resize(a.length/2); //元素为1/4,则变1/2 return item; //返回弹出的元素 } //重写iterator()从而返回Iterator对象 @Override public Iterator<Item> iterator() { return new ReverseArrayIterator(); } //定义嵌套类ReverseArrayIterator(方便访问a[]和N) public class ReverseArrayIterator implements Iterator<Item>{ //支持后进先出的迭代 private int i = N; @Override public boolean hasNext() { return i > 0; } @Override public Item next() { return a[--i]; } public void remove() {} }}
5.测试
完整代码:
import java.util.Iterator;import basis.ResizingArrayStack;public class MyTest { public static void main(String[] args) { new MyTest().start(); } private void start() { ResizingArrayStack<String> ras = new ResizingArrayStack<String>(); System.out.println("栈是否为空:"+ras.isEmpty()); System.out.println("栈的大小"+ras.size()); ras.push("元素0"); ras.push("元素1"); ras.push("元素2"); ras.push("元素3"); ras.push("元素4"); ras.push("元素5"); ras.push("元素6"); ras.push("元素7"); System.out.println("栈是否为空:"+ras.isEmpty()); System.out.println("栈的大小"+ras.size()); String str = ras.pop(); System.out.println("弹出的元素是:"+str); Iterator<String> iterator = ras.iterator(); while( iterator.hasNext() ) System.out.println(iterator.next()); }}
输出:
- Java下压栈实现-可调整数组大小(p88)
- 下压栈(能动态调整数组大小的实现)
- 下压栈(LIFO) (能动态调整数组大小的实现)
- 下压栈(能够动态调整数组大小的实现)
- java算法之下压栈来动态调整数组大小
- 下压栈:动态数组实现
- 下压栈-能够自动调整数组大小实现并实现迭代功能
- 下压栈——能够动态调整数组大小的实现
- 下压(LIFO)栈(能够动态调整数组大小的实现)
- 算法1.1 下压(LIFO)栈 (能够动态调整数组大小的实现)
- 算法1.1 下压(LIFO)栈(能动态调整数组大小的实现)
- 算法1.1 下压栈(LIFO)能动态调整数组的大小
- 下压栈:链表实现
- 下压堆栈 链表实现 Java
- PHP实现上传头像/带水印/可调整大小
- 可调整大小的对话框
- 下压栈(键表实现)
- 下压堆栈的链表实现 java版本
- mysql创建序列
- 小试Bean Validation
- network:vpn
- template.js的使用
- js正则表达式收录
- Java下压栈实现-可调整数组大小(p88)
- JS中变量和JSP中JAVA代码中变量互相访问解决方案
- xml基础、DTD验证、Schema验证(备忘)
- 班主任给1650432班的最后一次班会
- 第13周【项目3
- 第二周 项目3—汉诺塔
- 百度富文本ueditor的使用
- Android 使用SharedPreferences对象保存账号密码
- 洛谷 P2788 数学1(math1)- 加减算式