`

实例185 - 使用泛型实现栈结构

 
阅读更多

秘笈心法:泛型的优势。

除了在使用栈中的元素时不需要进行强制类型转换外,还可以让程序在编译过程中进行类型检查。例如,在本实例中,首先限制了栈只能保存String类型的元素。如果向栈中保存其他类型的元素,则编译时会报错。泛型的魅力在于让程序有更好的可读性和安全性。

package com.mingrisoft.generic;

import java.util.LinkedList;

public class Stack<T> {
    
    private LinkedList<T> container = new LinkedList<T>();
    
    public void push(T t) {
        container.addFirst(t);
    }
    
    public T pop() {
        return container.removeFirst();
    }
    
    public boolean empty() {
        return container.isEmpty();
    }
}

 

package com.mingrisoft.generic;

public class StackTest {
    public static void main(String[] args) {
        Stack<String> stack = new Stack<String>();
        System.out.println("向栈中增加字符串:");
        System.out.println("视频学Java");
        System.out.println("细说Java");
        System.out.println("Java从入门到精通(第2版)");
        stack.push("视频学Java");  //向栈中增加字符串
        stack.push("细说Java");   //向栈中增加字符串
        stack.push("Java从入门到精通(第2版)"); //向栈中增加字符串
        System.out.println("从栈中取出字符串:");
        while (!stack.empty()) {
            System.out.println(stack.pop());//删除栈中全部元素并进行输出
        }
    }
}

 运行结果:

向栈中增加字符串:
视频学Java
细说Java
Java从入门到精通(第2版)
从栈中取出字符串:
Java从入门到精通(第2版)
细说Java
视频学Java

 技巧:泛型参数的命名一般使用单个的大写字母,如对于任意类型可以使用字母T等。

 

补充知识:

 java.util.LinkedList

 

 

Doubly-linked list implementation of the List and Deque interfaces. Implements all optional list operations, and permits all elements (including null). 

 

All of the operations perform as could be expected for a doubly-linked list. Operations that index into the list will traverse the list from the beginning or the end, whichever is closer to the specified index. 

 

Note that this implementation is not synchronized. If multiple threads access a linked list concurrently, and at least one of the threads modifies the list structurally, it must be synchronized externally. (A structural modification is any operation that adds or deletes one or more elements; merely setting the value of an element is not a structural modification.) This is typically accomplished by synchronizing on some object that naturally encapsulates the list. If no such object exists, the list should be "wrapped" using the Collections.synchronizedList method. This is best done at creation time, to prevent accidental unsynchronized access to the list:

 

   List list = Collections.synchronizedList(new LinkedList(...));

The iterators returned by this class's iterator and listIterator methods are fail-fast: if the list is structurally modified at any time after the iterator is created, in any way except through the Iterator's own remove or add methods, the iterator will throw a ConcurrentModificationException. Thus, in the face of concurrent modification, the iterator fails quickly and cleanly, rather than risking arbitrary, non-deterministic behavior at an undetermined time in the future. 

 

Note that the fail-fast behavior of an iterator cannot be guaranteed as it is, generally speaking, impossible to make any hard guarantees in the presence of unsynchronized concurrent modification. Fail-fast iterators throw ConcurrentModificationException on a best-effort basis. Therefore, it would be wrong to write a program that depended on this exception for its correctness: the fail-fast behavior of iterators should be used only to detect bugs. 

 

This class is a member of the Java Collections Framework.

 

Parameters:

<E> the type of elements held in this collection

Since:

1.2

Author:

Josh Bloch

See Also:

List

ArrayList

分享到:
评论

相关推荐

    实例183 - 自定义非泛型栈结构

    标题“实例183 - 自定义非泛型栈结构”涉及的是编程中的数据结构实现,具体是栈(Stack)这一概念。栈是一种线性数据结构,遵循“后进先出”(Last In First Out, LIFO)的原则。在这个实例中,我们将探讨如何不使用...

    数据结构-加入泛型的线性表、栈、队列

    在编程领域,数据结构是构建高效算法的基础,而线性表、栈和队列是最基本且重要的数据结构。本文将详细探讨如何在Java或C#等支持泛型的语言中,为JWList和JWArray类加入泛型支持,以实现更加灵活和强大的功能。 ...

    java使用泛型实现栈结构示例分享

    在这个实例中,我们将探讨如何使用泛型来实现一个栈数据结构。栈是一种后进先出(LIFO)的数据结构,常见的操作有压入(push)和弹出(pop)。在Java中,虽然有内置的`java.util.Stack`类,但为了演示泛型的用法,...

    C#泛型集合使用实例

    6. **泛型栈(Stack)** 栈遵循后进先出(LIFO)原则,使用`Push`方法将元素压入栈顶,`Pop`方法移除并返回栈顶元素。`Stack&lt;T&gt;`同样实现了`ICollection&lt;T&gt;`和`IEnumerable&lt;T&gt;`接口。 7. **泛型集合的优势** - ...

    细细品味C#(泛型专题)

    - **泛型实例化**:当使用泛型类或方法时,需要指定具体的类型参数来实例化泛型。 - **3.2.2 获取泛型类型和使用相应的泛型版本替换 ArrayList** - **类型获取**:使用 `typeof(T)` 来获取泛型类型的信息。 - *...

    基于Java的实例源码-最短路径算法实现 k-shortest-paths.zip

    7. **数据结构与算法**:在Java实现中,常用的数据结构包括数组、链表、队列、栈、优先队列等。算法方面,除了上述提到的路径搜索算法,还需要理解动态规划、回溯、递归等概念。 8. **编程技巧**:良好的代码组织和...

    泛型实例详解

    为了直观展示泛型的应用,我们以栈这一数据结构为例。传统的栈实现通常绑定于特定类型,如int或string,导致代码重复且缺乏灵活性。而使用泛型,我们能够定义一个通用的栈类`Stack&lt;T&gt;`,其中`T`代表任何类型。这意味...

    泛型编程小实例(以List为例)

    - **声明泛型类**:如自定义一个泛型栈`public class MyStack&lt;T&gt; { ... }`,`T`为类型参数,代表栈中元素的类型。 - **声明泛型接口**:如`public interface MyList&lt;T&gt; { ... }`,`T`为接口中方法使用的类型。 - ...

    cpp-这是一个关于数据结构的C语言静态链接库支持泛型

    在C++中,泛型是通过模板实现的,可以创建不依赖特定类型的数据结构,如数组、队列、栈、链表等。在C语言中,由于没有内置的泛型机制,通常需要为每种数据类型编写单独的实现,这增加了代码重复和维护难度。该静态...

    算法Ⅰ-Ⅳ(C++ 实现)--基础、数据结构、排序和搜索

    《算法Ⅰ-Ⅳ(C++ 实现)--基础、数据结构、排序和搜索》是一部深入探讨计算机算法的经典著作,尤其适合C++编程者学习。本书覆盖了算法的基础知识,包括基本概念、设计技巧以及分析方法,同时详细讲解了数据结构、排序...

    数据结构 栈 链表实现 c++ 模板

    总结来说,这个项目涵盖了数据结构中的栈,通过链表实现并使用C++模板技术,提供了代码的通用性和高效性。同时,驱动程序`StackDrive.cpp`提供了对栈操作的测试,确保了实现的正确性。对于学习和理解C++模板以及数据...

    泛型顺序队列和循环队列

    通过学习这个实例,你可以深入了解C#中队列数据结构的实现和应用,掌握泛型在数据结构中的运用,以及如何将不同数据结构(如队列和栈)结合起来解决实际问题。这对你在编程领域的深入理解和实践有着重要的作用。记得...

    Objective C Generics.zip

    例如,你可以创建一个名为 `Stack` 的泛型栈类,其中的元素可以是任何类型: ```objc @interface Stack&lt;T&gt; { NSMutableArray&lt;T&gt; *items; } ``` 这样,当实例化 `Stack` 类时,可以指定元素的具体类型,如 `...

    数据结构 栈的模板类线性表实现

    在这个主题中,“数据结构 栈的模板类线性表实现”指的是使用C++编程语言设计一个泛型模板类,用于实现栈的功能,基于线性表的概念。线性表是数据结构中最基础的一种,它是由n(n&gt;=0)个相同类型元素构成的有限序列...

    Java中使用数组实现栈数据结构实例

    在这个实现中,我们使用了泛型E来确保栈可以存储任何类型的对象。`push()`方法检查栈是否已满,如果满了,就创建一个新数组并复制旧数组中的所有元素。`pop()`方法则会检查栈是否为空,避免空栈出栈引发异常。同时,...

    C# 之泛型详解

    泛型通过引入类型参数(如`T`)来实现这一目标,类型参数是一个占位符,会在类或方法实例化时被实际的数据类型替换。 在上述示例中,`Stack&lt;T&gt;`类展示了泛型的用法。类中`T`表示一个通用类型,`private T[] m_item;...

    C#实例.net-经典例子400个

    3. **集合与数据结构**:数组、列表(List)、队列(Queue)、栈(Stack)、字典(Dictionary, TValue&gt;)、集合(HashSet)等。 4. **泛型**:泛型类、泛型接口、泛型方法,以及它们在集合和算法中的应用。 5. **...

Global site tag (gtag.js) - Google Analytics