(堆)栈概述
栈是一种特殊的线性表,是操作受限的线性表
栈的定义和特点
•定义:限定仅在表尾进行插入或删除操作的线性表,表尾—栈顶,表头—栈底,不含元素的空表称空栈
•特点:先进后出(FILO)或后进先出(LIFO)
栈的结构,如下图所示:

线性表的操作主要包括:
(1)清空(堆)栈
(2)判断是否为空
(3)元素的个数
(4)入栈
(5)出栈
(6)取栈顶元素
接口
由此,对队列的抽象数据类型定义Queue接口如下:
    package stack;  
    /**
     * (堆)栈
     * @author Administrator
     *
     */  
    public interface Stack {  
        /**
         * 清空堆栈
         */  
        public void clear();  
        /**
         * 入栈
         * @param obj 入栈的元素
         */  
        public void push(Object obj);  
        /**
         * 出栈
         * @return 出栈的结果
         */  
        public Object pop();  
        /**
         * 判断是否为空
         * @return
         */  
        public boolean isEmpty();  
        /**
         * 求元素的个数
         * @return 元素的个数
         */  
        public int size();  
        /**
         * 取栈顶元素
         * @return 栈顶元素
         */  
        public Object peek();  
          
    }

顺序(堆)栈
结构模型

栈顶指针top,指向实际栈顶后的空位置,初值为0。
栈的初始空间大小为M
top=0,栈空,此时出栈,则下溢(underflow);
top=M,栈满,此时入栈,则上溢(overflow);
源代码
    package stack;  
    /**
     * 顺序(堆)栈
     * @author Administrator
     *
     */  
    public class ArrayStack implements Stack{  
        private static int DEFAULT_SIZE = 100;   
        private int Top;  
        Object array[];  
          
        public ArrayStack() {  
            Top = 0;  
            array = new Object[DEFAULT_SIZE];  
        }  
          
        public boolean isEmpty() {  
              
                return 0 == Top ;  
      
        }  
        public void expand() {  
            Object[] newArray = new Object[2 * array.length];  
            for(int i=0; i<array.length; i++) {  
                newArray[i] = array[i];  
            }  
            array = newArray;  
        }  
        /*
        public void expand() {
            try {
                Object[] newArray = new Object[2*DEFAULT_SIZE];
                for(int i=0; i<array.length; i++) {
                    newArray[i] = array[i];
                }
                array = newArray;
            }catch(OutOfMemoryError e) {
                System.out.println("error in expand of Stack class!");
                //e.printStackTrace();
            }
             
             
            DEFAULT_SIZE = 2*DEFAULT_SIZE;
        }
        */  
        public void push(Object obj) {  
            if(Top == array.length) {  
                expand();  
            }     
            array[Top] =obj;  
            Top ++;  
              
        }  
          
        public Object pop() {  
            if(0 == Top) throw new IllegalStateException();  
            Object val = array[-- Top];  
            array[Top] = null;  
            return val;  
              
        }  
          
        public void clear() {  
            for(int i=0; i<array.length; i++) {  
                array[i] = null;  
                Top = 0;  
            }  
        }  
          
        public Object peek() {  
            if(0 == Top) throw new IllegalStateException();  
            return array[Top - 1];  
        }  
          
        public int size() {  
            return Top;  
        }  
          
        public String toString() {  
            String s = "[";  
            for(int i=Top-1; i>=0 ; i--) {  
                s = s + array[i];  
                s = s + ",  ";  
            }  
            s = s + "]";  
            return s;  
        }  
          
    }

链式(堆)栈
结构模型

源代码
    package stack;  
      
    /**
     * 链式(堆)栈的结点
     * @author luoweifu
     *
     */  
    class Node{  
        Object data;    //数据元素  
        Node next;      //后驱结点  
        public Node() {  
            this(null);  
        }  
        public Node(Object data) {  
            this.data = data;  
            this.next = null;  
        }  
    }  
      
    /**
     * 链式(堆)栈, 无头结点
     * @author Administrator
     *
     */  
    public class LinkStack implements Stack {  
        private Node top;   //栈顶指针  
        private int size;   //栈的大小  
          
        public LinkStack() {  
            top = null;  
            size = 0;  
        }  
          
        @Override  
        public void clear() {  
            top = null;  
            size = 0;  
        }  
      
        @Override  
        public void push(Object obj) {  
            Node p = new Node(obj);  
            if(top == null) {  
                top = p;  
            } else {  
                p.next = top;  
                top = p;  
            }  
            size ++;  
        }  
      
        @Override  
        public Object pop() {  
            Node p = top;  
            top = top.next;  
            size --;  
            return p.data;  
        }  
      
        @Override  
        public boolean isEmpty() {  
            if(size == 0)  
                return true;  
            else  
                return false;  
        }  
      
        @Override  
        public int size() {  
            return size;  
        }  
      
        @Override  
        public Object peek() {  
            return top.data;  
        }  
          
      
        public String toString() {  
            StringBuilder sb = new StringBuilder("[");  
            Node p = top;  
            if(p == null) {  
                sb.append("");  
            } else {  
                do{  
                    sb.append(p.data + ",  ");  
                }while((p = p.next) != null);  
            }  
            sb.append("]");  
            return sb.toString();  
        }  
    }

测试(堆)栈
    package stack;  
      
    public class Test {  
        /**
         * 测试堆栈
         * @param args
         */  
        public static void main(String[] args) {  
            //Stack stack = new ArrayStack();  
            Stack stack = new LinkStack();  
            for(int i=0; i<10; i++) {  
                stack.push(i);  
            }  
            System.out.println(stack.toString());  
            Object a = stack.pop();  
            System.out.println(a + stack.toString());  
            stack.push(20);  
            Object b = stack.peek();  
            System.out.println( b + stack.toString());  
            stack.clear();  
            System.out.println( "数据数量:" + stack.size()  
                    + "  isEmpty? " + stack.isEmpty() + "  数据为:" + stack.toString());  
        }  
          
    }

结果
[9,  8,  7,  6,  5,  4,  3,  2,  1,  0,  ]
9[8,  7,  6,  5,  4,  3,  2,  1,  0,  ]
20[20,  8,  7,  6,  5,  4,  3,  2,  1,  0,  ]
数据数量:0  isEmpty? true  数据为:[]

转载至:http://blog.csdn.net/luoweifu/article/details/8507836

java数据结构之(堆)栈的更多相关文章

  1. Java数据结构和算法 - 栈和队列

    Q: 栈.队列与数组的区别? A: 本篇主要涉及三种数据存储类型:栈.队列和优先级队列,它与数组主要有如下三个区别: A: (一)程序员工具 数组和其他的结构(栈.队列.链表.树等等)都适用于数据库应 ...

  2. Java数据结构之堆和优先队列

    概述 在谈堆之前,我们先了解什么是优先队列.我们每天都在排队,银行,医院,购物都得排队.排在队首先处理事情,处理完才能从这个队伍离开,又有新的人来排在队尾.但仅仅这样就能满足我们生活需求吗,明显不能. ...

  3. Java数据结构系列之——栈(2):栈的链式存储结构及其操作

    package Stack; import LinkList.SinglyLinkList; public class LinkListStack { private SinglyLinkList&l ...

  4. java 数据结构与算法---栈

    原理来自百度百科 一.栈的定义 栈是一种只能在一端进行插入和删除操作的特殊线性表:它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数 ...

  5. 6, java数据结构和算法: 栈的应用, 逆波兰计算器, 中缀表达式--> 后缀表达式

    直接上代码: public class PolandCalculator { //栈的应用:波兰计算器: 即: 输入一个字符串,来计算结果, 比如 1+((2+3)×4)-5 结果为16 public ...

  6. 5, java数据结构和算法: 栈 , 入栈, 出栈, 正序遍历,,逆序遍历

    直接上代码: class ArrayStack{ //用数组模拟栈 int maxSize; int[] stack; int top = -1;//表示栈顶 public ArrayStack(in ...

  7. JAVA数据结构系列 栈

    java数据结构系列之栈 手写栈 1.利用链表做出栈,因为栈的特殊,插入删除操作都是在栈顶进行,链表不用担心栈的长度,所以链表再合适不过了,非常好用,不过它在插入和删除元素的时候,速度比数组栈慢,因为 ...

  8. java中的堆与栈

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

  9. java中的堆、栈、方法区等比较

    • 堆.栈.方法区 1. java中的栈(stack)和堆(heap)是java在内存(ram)中存放数据的地方 2. 堆区 存储的全部是对象,每个对象都包含一个与之对应的class的信息.(clas ...

随机推荐

  1. origin里用c语言编程

    学习自白东升老师的origin8.0课程. 其实是originC语言.origin中大多绘图和处理功能都是originC语言完成的,可以同时按下ctrl和shift然后点击相应的功能,就会出现每个按钮 ...

  2. nlms_step_get

    module nlms_step_get(   rst ,   clk ,   nd ,      din01_i,   din01_q,   din02_i,   din02_q,      dou ...

  3. SPSS-两变量相关性分析

    两个变量之间存在确定性:关系和不确定关系(会存在一定的波动范围),就好比你的亲生母亲绝对只有一个,而你的亲叔叔可能有好几个(可以在1叔—4叔之间波动) 相关性一般分为   1:强正相关关系  (一个值 ...

  4. 基于SceneControl的三维GIS开发

    在ArcGIS体系中,三维开发包括两种:基于Scene的三维开发和基于Globe的三维开发. 由上图可以看出,两种开发的接口都很相似,掌握了Scene开发会相对容易的过渡到Globe开发中. 正如上图 ...

  5. c++ 内联函数 (讲解的TM真好)

    1.  内联函数 在C++中我们通常定义以下函数来求两个整数的最大值: 复制代码 代码如下: int max(int a, int b) {  return a > b ? a : b; } 为 ...

  6. log4j自动加载原理

    java虚拟机加载log4j的类(LogManager.class)后,执行静态代码块,这个类中的静态代码块,会load log4j的配置文件,依次加载log4j.xml,log4j.properti ...

  7. Delphi XE4 For IOS中程序的调试(虚拟机,真实机和win32)

    安装完之后,大家可以看一下XE4可以新建的工程类型: File->New: 是不是多出了FireMonkey Mobile Application这一个选项呀! 然后你再点击这个菜单项,弹出Fi ...

  8. Delphi 动态与静态调用DLL(最好的资料)

    摘要:本文阐述了 Windows 环境下动态链接库的概念和特点,对静态调用和动态调用两种调用方式作出了比较,并给出了 Delphi 中应用动态链接库的实例. 一.动态链接库的概念    动态链接库(  ...

  9. 仿建设银行APP首页效果

    仿建设银行APP首页效果 下载地址: http://pan.baidu.com/s/1eRMYEzC 下载后需要解压,解压密码联系:390980233  收费88元 HTML+JS实现,下载即可试用. ...

  10. 【加密算法】AES

    一.简介 AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高. 用AES加密2000年10月,NIST(美国国家标准和技术协会 ...