`
agan112
  • 浏览: 67818 次
  • 来自: 金陵那平
社区版块
存档分类
最新评论

栈的基本原理,实现自己的堆栈

 
阅读更多
栈是重要的数据结构,从数据结构角度看,栈也是线性表,其特殊性在栈的基本操作是线性表的子集。Stack作为最基本的数据结构,在JDK代码中,也有它的实现,java.util.Stack类是继承了Vector类,来实现了栈的基本功能。



1.栈的基本原理



栈(Stack)是限定仅在表尾进行插入或者删除操作的线性表。因此,对于栈来说,表尾端有特殊含义,成为栈顶,表头称之为栈底。



由下图可以看出,栈的最基本的特征是LIFO(Last In First Out),因此栈又被称为后进先出 的线性表。





2.栈的基本操作



InitStack(&S)--------------构造一个空栈

IsEmpty:判断栈是否为空

ClearStack:清空栈

StackLength:栈S的元素个数,即栈的长度

GetTop:获取栈顶元素

Push:插入新的元素

Pop:删除栈顶元素



3.java.util.Stack源码解析



1)数据结构:利用Vector(动态数组)完成后进先出的操作

2)基本方法:



     //初始化一个长度为10 的数组

     构造器      public Stack():



    //放入新元素到栈顶

     public E push(E item){

           //按序更新数组元素(计数器判断最后更新数组元素的索引)

           addElement(item);

           return item;

    }



    /**

   *1.如果由于新增的元素导致数组的长度不够,则把原来的数组尺寸翻倍,并拷贝老数组元素到新的数组

   *2.

   *

   *

   */

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





//pop栈顶元素

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

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

    return obj;
    }



4.java.util.stack的缺点

上述源码分析我们知道,Stack利用Vector动态数组实现了后进先出的栈的基本功能,但是数组有下列缺陷:



1)当数组默认的容量发生改变时,push的性能会有较大降低


5.实现自己的Stack类



数组的缺点是,当数组长度发生变化时,原有的元素需要经过copy到新的数组中,这样性能有较大的损耗,而链表最大的优点是插入和删除的性能非常好,Java提供了现成的双向链表类java.util.LinkedList,通过它可以快速编写自己的Stack程序,源码如下:



public class Stack<E>{
    LinkedList<E> list;
  
    public Stack(){
        list = new LinkedList();
    }
  
    public E pop(){
        return list.removeLast();
    }
  
    public void push(E o){
        list.add(o);
    }
  
    public E getTop(){
        return list.getLast();
    }
  
    public boolean isEmpty(){
        return list.size()==0;
    }
  
    public int size(){
        return list.size();
    }
  
    public static void main(String[] args) {
        Stack stack = new Stack();
        stack.push("bottom");
        stack.push("middle");
        stack.push("top");
        System.out.println(stack.isEmpty());
        System.out.println(stack.getTop());
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.isEmpty());
    }
  
}
  • 大小: 35.6 KB
分享到:
评论

相关推荐

    栈的原理详解及其python实现

    文章目录一、原理介绍1、基本介绍及特点二、python实现(一)、顺序栈的实现1、Python实现顺序栈2、代码测试(二)、链栈1、Python实现链栈2、测试三、注意事项(持续补充中…) 一、原理介绍 1、基本介绍及特点 栈...

    数据结构实验报告-栈与队列-中缀表达式求值-实验内容及要求.docx

    基本要求:实现 +, -, *, /四个二元运算符以及(); 操作数范围为0至9。 提高要求:实现+, -, *, /四个二元运算符以及(); 实现+, -两个一元运算符(即正、负号); 操作数可为任意整型值(程序假定整数及运算...

    深入JVM内核 - 原理、诊断与优化

    在本课程中个,将详细介绍JVM的基本原理、组成以及工作方式,并配合实际案例,介绍相关的调优技巧。 课程大纲: 第一课 初识JVM JVM分类 Java语言规范 JVM规范 介绍JVM的基本知识和发展历史,并介绍了Java语言...

    嵌入式系统软件设计中的数据结构

    书中基本内容有:常用线性数据结构在嵌入式系统中的实现和相关算法;树和图在嵌入式系统中的实现和相关算法;排序和查找算法等。  本书从嵌入式系统的实际硬件环境出发,用通俗易懂的语言代替枯燥难懂的理论解释,...

    传智播客扫地僧视频讲义源码

    14_内存四区基本原理_全局区案例理解 15_内存四区_堆栈案例理解 16_课堂答疑_理解指针的关键关键在内存 17_vs20102013上配置#系列快捷方式 18_栈的属性和buf地址增长方向是两个不同的概念 19_函数调用模型_主调函数...

    JavaScript版 数据结构与算法

    原理讲解 8-2 循环队列-代码实操 8-3 任务队列-原理讲解 8-4 任务队列-代码实操 第9章 数据结构之“链表”链表是一个有序的线性数据结构,对于它而言排序和循环是最基本的两项技能,这个章节从零是实现链表结构到...

    深入分析Linux内核源码

    12.4.2 套接字缓冲区操作基本原理 12.4.3 sk_buff数据结构的核心内容 12.4.4 套接字缓冲区提供的函数 12.4.5 套接字缓冲区的上层支持例程 12.5 网络设备接口 12.5.1 基本结构 12.5.2 命名规则 12.5.3 设备...

    CSAPP AttackLab实验解决源码(亲测有效!!!)

    要求深入了解程序内存布局、堆栈和函数调用等概念,并学会利用输入缓冲区溢出漏洞来修改程序行为,这有助于理解系统安全中的一些基本原则和漏洞。Attack Lab实验让我学会了如何使用金丝雀进行防护,掌握了如何在程序...

    数据结构与算法C++版-Data Structures and Algorithms in C++ Second Edition Adam Drozdek

    与同类教材相比,本书不仅提供了任何软件系统从设计、实现、测试到维护所需的基本概念,详尽地讨论了同类教材中少见的内存管理和数据压缩主题,还将对递归的讨论置于运行时堆栈环境中,使读者对递归有更明晰的理解...

    Data Structures and Algorithms Using C#

    与同类教材相比,本书不仅提供了任何软件系统从设计、实现、测试到维护所需的基本概念,详尽地讨论了同类教材中少见的内存管理和数据压缩主题,还将对递归的讨论置于运行时堆栈环境中,使读者对递归有更明晰的理解...

    计算机二级C语言考试题预测

    (46) 面向对象的设计方法与传统的的面向过程的方法有本质不同,它的基本原理是(C) A. 模拟现实世界中不同事物之间的联系 B. 强调模拟现实世界中的算法而不强调概念 C. 使用现实世界的概念抽象地思考问题从而自然地...

    数据结构与算法C++版-Data Structures and Algorithms in C++ Second Edition Adam Drozdek-1/3

    与同类教材相比,本书不仅提供了任何软件系统从设计、实现、测试到维护所需的基本概念,详尽地讨论了同类教材中少见的内存管理和数据压缩主题,还将对递归的讨论置于运行时堆栈环境中,使读者对递归有更明晰的理解...

    windows驱动开发技术详解-part2

    Windows操作系统的基本原理、NT驱动程序与WDM驱动程序的构造、驱动程序中的同步异步处理方法、驱 动程序中即插即用功能、驱动程序的各种调试技巧等。同时,还针对流行的PCI驱动程序、USB驱动程序 、虚拟串口驱动...

    Windows驱动开发技术详解的光盘-part1

    本书共分23章,内容涵盖了Windows操作系统的基本原理、NT驱动程序与WDM驱动程序的构造、驱动程序中的同步异步处理方法、驱动程序中即插即用功能、驱动程序的各种调试技巧等。同时,还针对流行的PCI驱动程序、USB驱动...

    Windows内核安全与驱动开发光盘源码

    11.1.2 生成自己的一个控制设备 201 11.2 文件系统的分发函数 202 11.2.1 普通的分发函数 202 11.2.2 文件过滤的快速IO分发函数 203 11.2.3 快速IO分发函数的一个实现 205 11.2.4 快速IO分发函数逐个简介 206 ...

    Windows内核安全驱动开发(随书光盘)

    11.1.2 生成自己的一个控制设备 201 11.2 文件系统的分发函数 202 11.2.1 普通的分发函数 202 11.2.2 文件过滤的快速IO分发函数 203 11.2.3 快速IO分发函数的一个实现 205 11.2.4 快速IO分发函数逐个简介 206 ...

    一些C面试题,希望能对大家有帮助

    2.用两个栈实现一个队列的功能?要求给出算法和思路! 设2个栈为A,B, 一开始均为空. 入队: 将新元素push入栈A; 出队: (1)判断栈B是否为空; (2)如果不为空,则将栈A中所有元素依次pop出并push到栈B; (3)将栈B的...

    C/C++程序员面试指南.杨国祥(带详细书签).pdf

    还介绍了排序算法及数据结构的实现,包括链表、堆栈、队列和树。此外,本书开始用两章篇幅详细介绍了中英文面试的注意事项、常见问题及程序员的职业规划等软件工程师的常识。最后四章详细讲解了现在流行的智力测试题...

    单片机课程设计密码锁.doc

    堆栈栈底设置在30H。 3.2 设计课题软件系统各模块功能简要介绍 本程序通过以下各子模块程序实现: 主程序、数码管显示子程序、定时1ms程序、定时10ms子程序、。 主程序:主要是用于对输入信号的处理、输出信号的控制...

    嵌入式Linux C编程入门(第2版) PPT

    2.4.5 堆栈相关命令 55 2.5 make工程管理器 55 2.5.1 makefile基本结构 56 2.5.2 makefile变量 58 2.5.3 makefile规则 61 2.5.4 make使用 62 2.6 emacs综合编辑器 63 2.6.1 emacs的启动与退出...

Global site tag (gtag.js) - Google Analytics