`
xurichusheng
  • 浏览: 345077 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

java 栈

    博客分类:
  • java
阅读更多

import java.util.Arrays;

/**
* 
* <栈>
* <后进先出>
* @author  
* @version  [版本号, 2011-9-19]
* @see  [相关类/方法]
* @since  [产品/模块版本]
*/
public class SequenceStack<T>{
    private int DEFAULT_INIT_SIZE = 10;
    
    //保存数组的长度
    private int capacity;
    
    //定义当底层容量不够时,程序每次增加的数组长度
    private int capacityIncrement = 0;
    
    //定义一个数组,用于保存顺序栈的元素
    private Object[] elementData;
    
    //保存顺序栈中元素的当前个数
    private int size = 0;
    
    /**
     * <以默认数组长度创建空顺序栈>
     */
    public SequenceStack(){
        capacity = DEFAULT_INIT_SIZE;
        elementData = new Object[capacity];
    }
    
    /**
     * <以一个初始化元素来创建顺序栈>
     * @param element 指定顺序栈中第一个元素
     */
    public SequenceStack(T element){
        this();
        elementData[0] = element;
        size++;
    }
    
    /**
     * <以指定长度的数组来创建顺序栈>
     * @param element 指定顺序栈中第一个元素
     * @param initSize 指定顺序栈底层数组的长度
     */
    public SequenceStack(T element, int initSize){
        this.capacity = initSize;
        elementData = new Object[capacity];
        elementData[0] = element;
        size++;
    }
    
    /**
     * <以指定长度的数组来创建顺序栈>
     * @param element 指定顺序栈中第一个元素
     * @param initSize 指定顺序栈底层数组的长度
     * @param capacityIncrement 定义当底层容量不够时,程序每次增加的数组长度
     */
    public SequenceStack(T element, int initSize, int capacityIncrement){
        this.capacity = initSize;
        this.capacityIncrement = capacityIncrement;
        elementData = new Object[capacity];
        elementData[0] = element;
        size++;
    }
    
    /**
     * <获取顺序栈的大小>
     * @return [参数说明]
     * 
     * @return int [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     * @author 
     * @date 2011-9-19
     */
    public int length(){
        return size;
    }
    
    /**
     * <入栈>
     * @param element [参数说明]
     * 
     * @return void [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     * @author 
     * @date 2011-9-19
     */
    public void push(T element){
        //栈长度+1
        ensureCapacity(size+1);
        //将要添加的元素放在栈顶
        elementData[size++] = element;
    }
    
    /**
     * <出栈>
     * 
     * @return void [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     * @author 
     * @date 2011-9-19
     */
    @SuppressWarnings("unchecked")
    public synchronized T pop(){
        if (isEmpty()){
            throw new IndexOutOfBoundsException("栈为空");
        }
        //获取栈顶元素
        T topValue = (T)elementData[size-1];
        //释放栈顶元素
        elementData[--size] = null;
        return topValue;
    }
    
    /**
     * <获取栈顶元素>
     * @return [参数说明]
     * 
     * @return T [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     * @author 
     * @date 2011-9-19
     */
    @SuppressWarnings("unchecked")
    public synchronized T peek(){
        
        if (isEmpty()){
            return null;
        }
        return (T)elementData[size-1];
    }
    
    /**
     * <判断栈是否为空>
     * @return [参数说明]
     * 
     * @return boolean [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     * @author 
     * @date 2011-9-19
     */
    public boolean isEmpty(){
        return size == 0;
    }
    
    /**
     * <清空栈>
     * 
     * @return void [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     * @author 
     * @date 2011-9-19
     */
    public void clear(){
        //将数组中的所有元素赋为null
        Arrays.fill(elementData, null);
        size = 0;
    }
    
    /**
     * <扩容>
     * @param minCapacity [参数说明]
     * 
     * @return void [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     * @author 
     * @date 2011-9-19
     */
    public void ensureCapacity(int minCapacity){
        //如果数组的原有长度小于目前所需的长度
        if (minCapacity > capacity){
            if (capacityIncrement > 0){
                while (capacity < minCapacity){
                    /*
                     * 不断地将capacity长度加capacityIncrement,
                     * 直到capacity大于minCapacity
                     */
                    capacity += capacityIncrement;
                }
            }else{
                while (capacity < minCapacity){
                    /*
                     * 不断地将capacity*2,
                     * 直到capacity大于minCapacity
                     */
                    capacity <<= 1;
                }
            }
            elementData = Arrays.copyOf(elementData, capacity);
        }
    }
    
    public String toString(){
        if (isEmpty()){
            return "[]";
        }
        StringBuilder sb = new StringBuilder("[");
        for (int i=size-1; i>-1; i--){
            sb.append(elementData[i].toString()+", ");
        }
        int len = sb.length();
        return sb.delete(len-2, len).append("]").toString();
    }
}

 

 

测试:

 

public class Test
{
    
    /** <一句话功能简述>
     * <功能详细描述>
     * @param args [参数说明]
     * 
     * @return void [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     * @author 
     * @date 2011-9-19
     */
    public static void main(String[] args)
    {
        SequenceStack<String> stack = new SequenceStack<String>();
        System.out.println("is empty:"+stack.isEmpty());
        stack.push("aaaa");
        stack.push("bbbb");
        stack.push("cccc");
        stack.push("dddd");
        System.out.println("is empty:"+stack.isEmpty());
        System.out.println(stack);
        //访问栈顶元素
        System.out.println("栈顶元素:"+stack.peek());
        //弹出一个元素
        System.out.println("第一次弹出栈顶元素:"+stack.pop());
        //再次弹出一个元素
        System.out.println("第二次弹出栈顶元素:"+stack.pop());
        
        System.out.println("两次pop之后的栈:"+stack);
        
        
    }
    
}

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    java 栈的实现和应用

    Java栈是一种基于后进先出(LIFO)原则的数据结构,它在计算机科学和编程中具有广泛的应用。本文将深入探讨Java中栈的实现以及其在实际应用中的使用。 首先,我们来理解栈的基本概念。栈是一种特殊类型的线性数据...

    关于Java栈与堆的思考

    关于Java栈与堆的深入解析 Java作为一种广泛使用的编程语言,其内存管理机制是学习者必须掌握的核心概念之一。在Java中,栈(Stack)与堆(Heap)是用于存储数据的主要区域,它们各自承担着不同的职责,对于理解...

    java栈实现计算器中缀表达式

    java数字栈和符号栈模拟计算器(中缀表达式) “计算中缀表达式”可以称得上是一个特别经典的关于栈的算法题,几乎在所有数据结构教材中都会涉及,而且很多公司面试或者笔试的时候都会把这道题作为一个考察点。可以说...

    Java栈详解Java栈详解.doc

    Java栈是Java虚拟机(JVM)内存模型的重要组成部分,主要负责存储方法调用过程中的局部变量、操作数和方法返回信息。栈的特点是后进先出(LIFO),每个线程都有自己的独立Java栈,确保了线程安全的数据存储。 1. **...

    java 栈和队列的小例子

    在Java编程语言中,栈(Stack)和队列(Queue)是两种基本的数据结构,它们在处理数据存储和操作方面有着广泛的应用。本教程将通过一些小例子来深入理解这两种数据结构及其在Java中的实现。 栈是一种后进先出(LIFO...

    解析Java栈与堆

    Java栈与堆的存储机制解析 Java栈和堆是Java语言中两个最基本的存储机制,它们都是Java用来在RAM中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。 1. 栈的存储机制: 栈的优势是...

    Java栈源代码.txt

    通过Java面向对象思想和类的封装性完成栈的类设计,选择合适的底层存储结构,完成栈的判空isEmpty()、进栈push()、出栈pop()、取栈顶元素peek(),栈存储的对象以泛型给出。并和Java中的Stack的类以及功能进行比较...

    java栈代码

    java栈实验代码

    Java卡Java卡虚拟机解释器Java栈异常处理[定义].pdf

    每个方法调用都会在Java栈上创建一个栈帧,包含方法的局部变量、操作数、返回地址等信息。Java栈的管理是解释器的重要职责,包括栈帧的分配、数据的压栈和出栈操作。 【异常处理】 异常处理机制是Java卡虚拟机不可...

    慢慢的回味.entry_point–JVM Java栈桢的创建1

    JVM Java栈桢的创建 Java虚拟机(JVM)是Java语言的运行环境,它负责将Java字节码转换为机器码并执行。在JVM中,栈桢的创建是Java程序执行的基础。本文将对JVM Java栈桢的创建进行详细的分析。 一、栈桢的概念 在...

    关于Java栈与堆的思考-

    栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。

    MiGong.rar_java 栈_migong_动态迷宫_栈 java

    在IT领域,迷宫求解是一个经典的问题,而在这个场景中,我们看到的是一个使用Java编程语言实现的迷宫求解算法,它基于栈数据结构。这个名为"Migong.rar"的压缩包包含了一个名为"MiGong"的程序,以及一个可能是链接或...

    JAVA栈类代码

    JAVA栈类程序代码,包括进栈,出栈,以及栈空栈满的判定,希望能帮助到大家。

    java中关于栈的使用

    关于栈的使用,内有关于使用的示例 栈的应用举例 1. 将10进制正整数num转换为n进制 private String conversion(int num, int n) { MyStack&lt;Integer&gt; myStack = new MyArrayStack(); Integer result = num; ...

    java 栈和堆,Java自动管理栈和堆

    栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。

    Java栈内存与堆内存

    Java把内存划分成两种:一种是栈内存,一种是堆内存。 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过...

    Java用栈实现的计算器

    在Java编程中,栈是一种非常重要的数据结构,它遵循“后进先出”(LIFO)的原则。本项目是利用栈来实现一个简单的计算器,不支持括号表达式的计算,其用户界面是通过Java Swing库构建的。下面将详细介绍这个计算器的...

    java栈与堆1

    本文将详细阐述Java和C++中栈与堆的区别以及Java在这方面的优势。 首先,我们来理解栈内存。栈内存主要负责存储程序运行过程中的局部变量,包括基本类型变量(如int、char)和对象的引用变量。在Java中,当函数执行...

    Java中堆内存与栈内存分配浅析

    ### Java中堆内存与栈内存分配浅析 #### 一、引言 在Java编程语言中,内存管理是一项至关重要的技术。程序运行时所使用的内存主要分为两类:堆内存(Heap Memory)和栈内存(Stack Memory)。理解这两种内存类型的...

Global site tag (gtag.js) - Google Analytics