②泡茶看<数据结构>,喜欢看源码-栈ADT

前言

  听着天籁,我是个音乐迷。时间充实着,会过得很快。我马上也可以到傍晚的时候去乐室吹我心爱的萨克斯。

 

                    

                    嘟嘟嘟... 我会吹一首简单的歌咯,哈哈我想到了一个神奇的比喻,待会说。

栈ADT模型(又称LIFO表)

  栈(stack)插入和删除只能在一个位置上进行的表。该位置是表的末端但是叫做栈的顶(top)。基本操作:进栈(push相当于插入)和出栈(pop相当于删除)。又称LIFO表,后进先出。

 

      相当于

                    就想快速呼吸一样。先吸进来的空气,先呼出去。

                     你是否记住了?

 

栈的源码和数组实现

 

  java.util.Stack

 

   不得不申明下,小朽研究不深,如果大家看到了希望能指点指点我。有些时候,说错了,我马上会改正的。谢谢。先介绍类的结构图

   

 

    下面是源码 java.util.Stack

/*
 * Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package java.util;

/**
 * The <code>Stack</code> class represents a last-in-first-out
 * (LIFO) stack of objects. It extends class <tt>Vector</tt> with five
 * operations that allow a vector to be treated as a stack. The usual
 * <tt>push</tt> and <tt>pop</tt> operations are provided, as well as a
 * method to <tt>peek</tt> at the top item on the stack, a method to test
 * for whether the stack is <tt>empty</tt>, and a method to <tt>search</tt>
 * the stack for an item and discover how far it is from the top.
 * <p>
 * When a stack is first created, it contains no items.
 *
 * <p>A more complete and consistent set of LIFO stack operations is
 * provided by the {@link Deque} interface and its implementations, which
 * should be used in preference to this class.  For example:
 * <pre>   {@code
 *   Deque<Integer> stack = new ArrayDeque<Integer>();}</pre>
 *
 * @author  Jonathan Payne
 * @since   JDK1.0
 */
public
class Stack<E> extends Vector<E> {
    /**
     * Creates an empty Stack.
     */
    public Stack() {
    }

    /**
     * Pushes an item onto the top of this stack. This has exactly
     * the same effect as:
     * <blockquote><pre>
     * addElement(item)</pre></blockquote>
     *
     * @param   item   the item to be pushed onto this stack.
     * @return  the <code>item</code> argument.
     * @see     java.util.Vector#addElement
     */
    public E push(E item) {
        addElement(item);

        return item;
    }

    /**
     * Removes the object at the top of this stack and returns that
     * object as the value of this function.
     *
     * @return  The object at the top of this stack (the last item
     *          of the <tt>Vector</tt> object).
     * @throws  EmptyStackException  if this stack is empty.
     */
    public synchronized E pop() {
        E       obj;
        int     len = size();

        obj = peek();
        removeElementAt(len - 1);

        return obj;
    }

    /**
     * Looks at the object at the top of this stack without removing it
     * from the stack.
     *
     * @return  the object at the top of this stack (the last item
     *          of the <tt>Vector</tt> object).
     * @throws  EmptyStackException  if this stack is empty.
     */
    public synchronized E peek() {
        int     len = size();

        if (len == 0)
            throw new EmptyStackException();
        return elementAt(len - 1);
    }

    /**
     * Tests if this stack is empty.
     *
     * @return  <code>true</code> if and only if this stack contains
     *          no items; <code>false</code> otherwise.
     */
    public boolean empty() {
        return size() == 0;
    }

    /**
     * Returns the 1-based position where an object is on this stack.
     * If the object <tt>o</tt> occurs as an item in this stack, this
     * method returns the distance from the top of the stack of the
     * occurrence nearest the top of the stack; the topmost item on the
     * stack is considered to be at distance <tt>1</tt>. The <tt>equals</tt>
     * method is used to compare <tt>o</tt> to the
     * items in this stack.
     *
     * @param   o   the desired object.
     * @return  the 1-based position from the top of the stack where
     *          the object is located; the return value <code>-1</code>
     *          indicates that the object is not on the stack.
     */
    public synchronized int search(Object o) {
        int i = lastIndexOf(o);

        if (i >= 0) {
            return size() - i;
        }
        return -1;
    }

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = 1224463164541339165L;
}

java.util.Stack

 

    ①Pushes an item onto the top of this stack.



public E push(E item) {
        addElement(item);

        return item;
    }

    从类的结构图可以看出,addElement是Stack父类Vector封装,用于一切其子类的封装。

 

     #Adds the specified component to the end of this vector



public synchronized void addElement(E obj) {
        modCount++;
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = obj;
    }

 

    ②Removes the object at the top of this stack and returns the onject that object as the value of this function

public synchronized E pop() {
        E       obj;
        int     len = size();

        obj = peek();
        removeElementAt(len - 1);

        return obj;
    }

     同样,跟addElement一样removeElementAt存在Vector

 

       #Deletes the component at the specified index. 

public synchronized void removeElementAt(int index) {
        modCount++;
        if (index >= elementCount) {
            throw new ArrayIndexOutOfBoundsException(index + " >= " +
                                                     elementCount);
        }
        else if (index < 0) {
            throw new ArrayIndexOutOfBoundsException(index);
        }
        int j = elementCount - index - 1;
        if (j > 0) {
            System.arraycopy(elementData, index + 1, elementData, index, j);
        }
        elementCount--;
        elementData[elementCount] = null; /* to let gc do its work */
    }

     But,这个是什么 peek(),别慌它也是存在Stack类中下面我们讲这个

 

    ③Looks at the object at the top of this stack without remocing it

public synchronized E peek() {
        int     len = size();

        if (len == 0)
            throw new EmptyStackException();
        return elementAt(len - 1);
    }

      跟addElement,removeElementAt一样,elementAt存在Vector

 

        #Returns the component at the specified index.

public synchronized E elementAt(int index) {
        if (index >= elementCount) {
            throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);
        }

        return elementData(index);
    }

 

   ④Tests if this stack is empty 



public boolean empty() {
        return size() == 0;
    }

    size() 来源于Vector,用于获取大小

 

   ⑤Stack中其他,就不做介绍罗列下

    void Stack()  //create an empty stack
    int search(Object o)  //return the 1 - based position where an obj is on this stack

 

  数组实现

 

package sedion.jeffli.bean;

/**
 * qq 1928348753
 * blog http://www.cnblogs.com/Alandre/
 * @author Jeff Li
 */
public class myS {       

  Object[] data; 

  int maxSize;
  int top;       

  public myS(int maxSize) {
      this.maxSize = maxSize;
      data = new Object[maxSize];
      top = -1;
  }       

  /**
   * 获取堆栈长度
   * @return 堆栈长度
   */
  public int getSize()
  {
    return maxSize;
  } 

  /**
   * 返回栈中元素的个数
   * @return 栈中元素的个数
   */
  public int getElementCount()
  {
    return top;
  } 

  /**
   * 判断栈空
   * @return 栈空
   */
  public boolean isEmpty()
  {
    return top == -1;
  } 

  /**
   * 判断栈满
   * @return 栈满
   */
  public boolean isFull()
  {
    return top+1 == maxSize;
  } 

  /**
   * 依次加入数据
   * @param data 加入的数据
   * @return 添加是否成功
   */
  public boolean push(Object data) {
    if(isFull())
    {
        System.out.println("栈已满!");
        return false;
    }
    this.data[++top] = data;
    return true;
  }       

  /**
   * 从栈中取出数据
   * @return 取出的数据
   */
  public Object pop() throws Exception{
    if(isEmpty())
    {
        throw new Exception("栈已空!");
    }
    return this.data[top--];
  }       

  /**
   * 返回栈顶元素
   * @return
   */
  public Object peek()
  {
    return this.data[getElementCount()];
  } 

  public static void main(String[] args) throws Exception {
      myS stack=new myS(1000);
      stack.push(new String("1"));
      stack.push(new String("2"));
      stack.push(new String("3"));
      stack.push(new String("4"));
      stack.push(new String("5"));   

      System.out.println("栈顶元素"+stack.peek());  

      while(stack.top>=0)
      {
          System.out.println("Position["+stack.top+"]:"+stack.pop());
      }
  }
}

 

 

栈的应用

    四则运算,计算器编程。这些,我想原理才是重要的。

时间: 2024-09-11 10:04:31

②泡茶看<数据结构>,喜欢看源码-栈ADT的相关文章

java源码-这个题目麻烦各位看下,求源码

问题描述 这个题目麻烦各位看下,求源码 这个项目怎么写啊,没有想出来,求大神?????????????????????????? 解决方案 分隔成字符串数组,然后去匹配?

一篇让你一眼就能看明白的browserify源码解析

今天贴上一篇一眼就能看明白的browserify生成的源码分析. 一个编译还原并附带注释的源码分析 (function createRequire(modules, caches, defaults) { function factory(index, u) { // 如果模块没加载过 if (!caches[index]) { // 如果模块在模块列表里未定义 if (!modules[index]) { // 如果全局环境存在require函数定义 var a = typeof requir

从JDK源码角度看Float

关于IEEE 754 在看Float前需要先了解IEEE 754标准,该标准定义了浮点数的格式还有一些特殊值,它规定了计算机中二进制与十进制浮点数转换的格式及方法.规定了四种表示浮点数值的方法,单精确度(32位).双精确度(64位).延伸单精确度(43位以上)与延伸双精确度(79位以上).多数编程语言支持单精确度和双精确度,这里讨论的Float就是Java的单精确度的实现. 浮点数的表示 浮点数由三部分组成,如下图,符号位s.指数e和尾数f. 对于求值我们是有一个公式对应的,根据该公式来看会更简

android studio-Android studio除了做app开发还能不能看Android源码

问题描述 Android studio除了做app开发还能不能看Android源码 现在想做ADB和Fastboot的移植,于是想在Android环境下编译ADB和Fastboot. 在网上看到一篇文档, 说的是" Both adb and fastboot are available for download within the ADT Bundle " 下载了Android studio 之后,在SDK Manager安装了那些tool和API,可是发现不知道从哪里看ADB哪些的

Eclipse直接看Java源码(含所需工具)

    还在为看不了java源码烦恼吗?本文根据网上搜集的材料以及亲身安装测试,总结经验如下,希望能够帮助有需要的朋友们,本总结有助于朋友们少走弯路哦!jadclipse可以帮助查看.class文件.   点击下载本文所需工具 方法/步骤 下载java源码反编译工具后,将net.sf.jadclipse_3.3.0.jar拷贝到eclipse的plugins目录下: 再删除eclipse的configuration目录下org.eclipse.update文件, 如果,你的eclipse是开着的

从JDK源码看InputStream

概况 JDK 给我们提供了很多实用的输入流 xxxInputStream,而 InputStream 是所有字节输入流的抽象.包括 ByteArrayInputStream .FilterInputStream .BufferedInputStream .DataInputStream 和 PushbackInputStream 等等. 继承结构 --java.lang.Object --java.io.InputStream 类定义 public abstract class InputStr

从JDK源码看System.exit

前言 在编写的Java程序中有时会遇到用 System.exit 来关闭JVM,其中调用 exit 方法时会包含一个状态参数n,即System.exit(n).这其实是一个约定值,如果为0则表示正常关闭,而非0则表示非正常关闭.这里我们从JDK源码看下不同状态都是怎么处理的. System与Runtime 先看System类的exit方法如下,可以看到它是间接调用了Runtime对象的exit方法. public static void exit(int status) { Runtime.ge

从JDK源码角度看Long

概况 Java的Long类主要的作用就是对基本类型long进行封装,提供了一些处理long类型的方法,比如long到String类型的转换方法或String类型到long类型的转换方法,当然也包含与其他类型之间的转换方法.除此之外还有一些位相关的操作. 继承结构 --java.lang.Object --java.lang.Number --java.lang.Long 主要属性 public static final long MIN_VALUE = 0x8000000000000000L;

从JDK源码角度看Integer

概况 Java的Integer类主要的作用就是对基本类型int进行封装,提供了一些处理int类型的方法,比如int到String类型的转换方法或String类型到int类型的转换方法,当然也包含与其他类型之间的转换方法.除此之外还有一些位相关的操作. 继承结构 --java.lang.Object --java.lang.Number --java.lang.Integer 主要属性 第一部分 public static final int MIN_VALUE = 0x80000000; pub