(堆)栈概述
栈是一种特殊的线性表,是操作受限的线性表
栈的定义和特点
•定义:限定仅在表尾进行插入或删除操作的线性表,表尾—栈顶,表头—栈底,不含元素的空表称空栈
•特点:先进后出(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. python面向对象开发的自我理解

    ​详细代码理解可以参考 笨鸟教程博客:http://www.runoob.com/python3/python3-class.html 面向对象经常被提起,那到底什么是面向对象呢? 它的基本概念:类, ...

  2. 一文读懂:超详细正态分布方差等于o的推导

    (uv)' = [(u+△u)(v+△v) - uv] /△x = (v△u+u△v +△u△v)/△x = v(△u/△x) + u(△v/△x) +(△u△v)/△x =u'v+uv'

  3. spring + rs + RocketMQ 【精】

    cxf-rs-rocketmq 项目地址:见git │ pom.xml │ └─src ├─main │ ├─java │ │ └─cn │ │ └─zno │ │ ├─pojo │ │ │ Rece ...

  4. Hibernate中OpenSessionInViewFilter(通常配置在web.xml文件中)的作用

    Spring为我们解决Hibernate的Session的关闭与开启问题. Hibernate 允许对关联对象.属性进行延迟加载,但是必须保证延迟加载的操作限于同一个 Hibernate Sessio ...

  5. PYQT5实现文件目录浏览

    def setBrowerPath(self): download_path = QtWidgets.QFileDialog.getExistingDirectory(self, "浏览&q ...

  6. C#判断本地文件,网络文件是否存在是否存在

    File.Exists 方法 (String) 确定指定的文件是否存在. 命名空间:   System.IO程序集:  mscorlib(位于 mscorlib.dll) 参数 path Type:  ...

  7. ipad协议7.0,与大佬们分享几套新老版本的协议源码及算法,交流心得。

  8. 将一个byte[]数组根据大小拆分为若干小byte[]数组方法

    /// <summary> /// 将大数组拆分为多个小数组 /// </summary> /// <param name="superbyte"&g ...

  9. 分享一个经验,代码打开mysql链接,执行存储过程时,提示:Table 'mysql.proc' doesn't exist

    先说说的场景 老项目,因为服务器升级了mysql数据库版本,从5.7.13升到8.0.15 然而代码里面有直连数据的访问,通过执行存储过程来查询数据的业务,此时抛出异常   Table 'mysql. ...

  10. day 112天,爬虫(拉钩网,斗音,GitHub)第二天

    提前准备工作.安装准备工作(day3用)  1. 安装scrapy  https://www.cnblogs.com/wupeiqi/articles/6229292.html a. 下载twiste ...