文档章节

实现简单的泛型栈

兔之
 兔之
发布于 2016/04/06 16:41
字数 272
阅读 79
收藏 2

栈里需要放不同的数据类型,所以需要实现泛型。

Stack 类支持迭代器,需要实现两个接口。

  • Stack 整个类作为 Iterable 接口的实现
  • Stack 类的 iterator() 方法返回一个迭代器,这个迭代器作为 Iterator 接口的实现。
import java.util.Iterator;

public class Stack<Item> implements Iterable<Item>
{
    public Iterator<Item> iterator() 
    {
        return new ListIterator();    
    }

    private class ListIterator implements Iterator<Item>
    {
        private Node current = first;

        public boolean hasNext() { return current != null; }
        public Item next()
        {
            Item item = current.item;
            current = current.next;
            return item;
        }
    }

    private class Node
    {
        Item item;
        Node next;
    }

    private Node first = null;

    public boolean isEmpty()
    { return first == null; }

    public void push(Item item)
    {
        Node oldfirst = first;
        first = new Node();
        first.item = item;
        first.next = oldfirst;
    }

    public Item pop()
    {
        Item item = first.item;
        first = first.next;
        return item;
    }

    public static void main(String[] argv)
    {
        Stack<String> stringStack = new Stack<String>();
        stringStack.push("huangyi");
        stringStack.push("jiahai");
        System.out.println(stringStack.pop());

        Stack<Integer> intStack = new Stack<Integer>();
        intStack.push(22);
        intStack.push(33);
        intStack.push(44);
        intStack.push(55);

        Iterator<Integer> iter = intStack.iterator();
        while (iter.hasNext())
        {
            Integer num = iter.next();
            System.out.println(num);
        }
    }
}

其中的迭代器遍历可以替换为这种简单的语法

for(Integer i: intStack)
    System.out.println(i);

另外,C++11 也兹此这种写法,参见 c++11-ranged-for-loop, C++ 也是如此优雅。

参考

https://class.coursera.org/algs4partI-010/lecture/21

http://www.cprogramming.com/c++11/c++11-ranged-for-loop.html

© 著作权归作者所有

兔之
粉丝 69
博文 250
码字总数 96477
作品 7
深圳
程序员
私信 提问
.NET 中的泛型 101

1.1.1 摘要 图1 C# 泛型介绍 在接触泛型之前,我们编程一般都是使用具体类型(char, int, string等)或自定义类型来定义我们变量,如果我们有一个功能很强的接口,而且我们想把它提取或重构成...

长平狐
2012/06/11
85
0
游戏引擎Mojoc,(8)C实现泛型ArrayList

泛型ArrayList是基础的数据结构,然而在C的标准库里并没有提供,所以需要自己手动实现一个。Mojoc的ArrayList实现经过了实践的测试,达到了稳定和高效的状态,源码ArrayList.h。 本文主要介绍...

scottcgi
2017/12/03
0
0
浅谈 Swift 中的泛型

缺乏一个重要特性:不支持泛型。幸运地是,拥有这一特性。泛型允许你声明的函数、类以及结构体支持不同的数据类型。 提出问题 优秀的泛型使用案例中,最常见的例子当属对栈(Stack)的操作。栈作...

jasoncool
2015/09/28
30
0
泛型 -- Generics

泛型代码可以让你写出根据自我需求定义、适用于任何类型的,灵活且可重用的函数和类型。它可以让你避免重复的代码,用一种清晰和抽象的方式来表达代码的意图。 泛型是 Swift 强大特征中的其中...

626224816
2014/08/03
0
0
c#泛型的使用

在2005年底微软公司正式发布了C# 2.0,与C# 1.x相比,新版本增加了很多新特性,其中最重要的是对泛型的支持。通过泛型,我们可以定义类型安全的数据结构,而无需使用实际的数据类型。这能显著...

zsj2018
2008/08/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

自定义ApiBoot Logging链路以及单元ID生成策略

ApiBoot Logging会为每一个请求都对应创建链路编号(TraceID)以及单元编号(SpanID),用于归类每一次请求日志,通过一个链路下日志单元的Parent SpanID可以进行上下级关系的梳理。 前文回顾...

恒宇少年
22分钟前
8
0
浅谈 Application 和 activity

对于 在 Application初始化一些变量,为什么不可以放在activity 或者其他的组件里呢? 这里就根据个人的理解来讲述一下,欢迎补充指正。 首先 activity 是以栈的形式出现,一个app应用会有多...

MrLins
22分钟前
8
0
Allegro的脚本文件内容里都有哪些

小伙伴们在使用Allegro的时候是否经常用到脚本文件夹呢?scr的用法其实可真不简单。。。 首先脚本文件的运行模式就存在很多种,比如不提示错误信息,不弹出确认对画框(这样很有利于我们执行...

demyar
23分钟前
16
0
微信升级外链管理规范,「砍一刀帮我加速」要被禁止了

原创: 蒋鸿昌 首发:「知晓程序」公众号 - 最好的微信新商业媒体 几天前,知名互联网评论人阑夕模仿皮尤研究中心(Pew Research Center)在美国做的互联网通识调查问卷,做了一份中文版问卷...

知晓云
24分钟前
14
0
CentOS 7接投影仪

我将一台安装着CentOS 7图形界面的惠普笔记本电脑当桌面使用。最近,想要连接投影仪时却遇到了问题。笔记本有一个HDMI接口。我买了一个HDMI---->VGA的转接线,连上笔记本电脑后,屏幕一直在闪...

大别阿郎
27分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部