(堆)栈概述
栈是一种特殊的线性表,是操作受限的线性表
栈的定义和特点
•定义:限定仅在表尾进行插入或删除操作的线性表,表尾—栈顶,表头—栈底,不含元素的空表称空栈
•特点:先进后出(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. HDU 1242 Rescue (BFS+优先队列)

    题意:X代表卫兵,a代表终点,r代表起始点,.代表路,#代表墙,走过.要花费一秒,走过x要花费2秒,求从起点到终点的最少时间. 析:一看到样例就知道是BFS了吧,很明显是最短路径问题,不过又加了一个条 ...

  2. (线段树)Just a Hook -- hdu -- 1689

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1698 思路: 我的想法很简单,像上一题一样从后面向前面来算,前面已经覆盖的,后面自然不能再来计算了,具体 ...

  3. Codeforces805 A. Fake NP 2017-05-05 08:30 327人阅读 评论(0) 收藏

    A. Fake NP time limit per test 1 second memory limit per test 256 megabytes input standard input out ...

  4. 基于Verilog HDL的二进制转BCD码实现

    在项目设计中,经常需要显示一些数值,比如温湿度,时间等等.在数字电路中数据都是用二进制的形式存储,要想显示就需要进行转换,对于一个两位的数值,对10取除可以得到其十位的数值,对10取余可以得到个位的数 ...

  5. AndroidPn消息推送

    接着前面的工作,消息接收之后,要推送给不同的客户端.关于消息推送,网上有很多方式,http长连接,xmpp协议,还有一个谷歌的貌似叫C2DM的东西. 在此之前,用openfire做了一个小demo,例 ...

  6. Linux - 修改文件编码

    enca -L zh_CN -x UTF- file

  7. DBCC--EXTENTINFO/IND/PAGE--显示数据页信息

    DBCC EXTENTINFO得到对象分配的区DBCC EXTENTINFO(<dbname|dbid>,<tabelname|tableid>[,{indexname|ind ...

  8. dorado-TabControl

    1.TabControl控件有点类似于.net中TableControl控件 2.常用属性 2.1 currentTab页面加载时,默认打开第几个tab,从0开始 2.2 shouMenuButton ...

  9. ruby,gem,rails之间的关系

    Q:ruby,gem,rails之间的关系? 简单点说:Ruby是一种脚本语言,Gem是基于Ruby的一些开发工具包,Rails也算是一组Gem,专门用来做网站的.不同的Gem可能会依赖不同的Ruby ...

  10. JAVA 从头开始<六>

    一.静态代码块 静态代码块不需要创建对象才执行,比对象数据优先存在于内存中 二.静态函数 三.单例设计模式 1.饿汉单例模式 缺点:一声明就创建一个对象,没有使用的话就浪费了. 2.懒汉单例模式 1. ...