栈是重要的数据结构,从数据结构角度看,栈也是线性表,其特殊性在栈的基本操作是线性表的子集。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());
}
}
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());
}
}
发表评论
-
初学者学习linux
2012-12-19 17:53 607http://wuhaoshu.blog.51cto.com/ ... -
jquery选择器总结
2012-11-21 11:43 9131.<script type="text/ja ... -
外网的压力测试
2012-11-07 10:32 1100外网的压力测试,可以使用apache的ab或curl-load ... -
试着学学object-c
2012-11-05 15:50 7281.http://www.neatstudio.com/sho ... -
java双括弧初始化
2012-10-22 17:39 134901. Map map = new HashMap() {{ ... -
学习java单例模式
2012-10-22 16:16 664http://calmness.iteye.com/blog/ ... -
JsonUtil错误总结
2012-09-26 10:10 1013java.lang.Integer cannot be cas ... -
struts2总结错误
2012-09-25 10:40 7061.数据类型的不对应,一般是,后台要求int而前端的zoneI ... -
Jquery总结
2012-09-18 14:08 0$.toJSON(); $.parseJson(unescap ... -
mysql学习总结
2012-08-23 17:19 8071.<![CDATA[ select ifnull(su ... -
学习强者的成长之路
2012-08-09 10:25 805http://xwnet.blog.51cto.com/233 ... -
MD5正规的写法
2012-07-20 10:26 845public static String getMD5(byt ... -
引用:异常处理!
2012-07-20 09:37 681... -
关于网站的设计
2012-07-19 10:08 696网站的性能优化:http://www.cnblogs.com/ ... -
eval用法
2012-07-12 10:12 846在函数中改变全局变量 var X2={} X2.Eval= ... -
错误总结
2012-07-11 10:38 6111.missing ) in parenthetical错误可 ... -
登录验证struts2
2012-07-09 09:40 706类需要继承ActionSupport,重写execute方法, ... -
学习js的好地方
2012-06-28 13:16 727http://www.zhuoda.org/lunzi/dir ... -
登陆页面
2012-06-26 18:42 920http://themeforest.net/item/dre ... -
学习Session 基类
2012-06-26 16:48 821package com.ruangao.framework.w ...
相关推荐
文章目录一、原理介绍1、基本介绍及特点二、python实现(一)、顺序栈的实现1、Python实现顺序栈2、代码测试(二)、链栈1、Python实现链栈2、测试三、注意事项(持续补充中…) 一、原理介绍 1、基本介绍及特点 栈...
基本要求:实现 +, -, *, /四个二元运算符以及(); 操作数范围为0至9。 提高要求:实现+, -, *, /四个二元运算符以及(); 实现+, -两个一元运算符(即正、负号); 操作数可为任意整型值(程序假定整数及运算...
在本课程中个,将详细介绍JVM的基本原理、组成以及工作方式,并配合实际案例,介绍相关的调优技巧。 课程大纲: 第一课 初识JVM JVM分类 Java语言规范 JVM规范 介绍JVM的基本知识和发展历史,并介绍了Java语言...
书中基本内容有:常用线性数据结构在嵌入式系统中的实现和相关算法;树和图在嵌入式系统中的实现和相关算法;排序和查找算法等。 本书从嵌入式系统的实际硬件环境出发,用通俗易懂的语言代替枯燥难懂的理论解释,...
14_内存四区基本原理_全局区案例理解 15_内存四区_堆栈案例理解 16_课堂答疑_理解指针的关键关键在内存 17_vs20102013上配置#系列快捷方式 18_栈的属性和buf地址增长方向是两个不同的概念 19_函数调用模型_主调函数...
原理讲解 8-2 循环队列-代码实操 8-3 任务队列-原理讲解 8-4 任务队列-代码实操 第9章 数据结构之“链表”链表是一个有序的线性数据结构,对于它而言排序和循环是最基本的两项技能,这个章节从零是实现链表结构到...
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 设备...
要求深入了解程序内存布局、堆栈和函数调用等概念,并学会利用输入缓冲区溢出漏洞来修改程序行为,这有助于理解系统安全中的一些基本原则和漏洞。Attack Lab实验让我学会了如何使用金丝雀进行防护,掌握了如何在程序...
与同类教材相比,本书不仅提供了任何软件系统从设计、实现、测试到维护所需的基本概念,详尽地讨论了同类教材中少见的内存管理和数据压缩主题,还将对递归的讨论置于运行时堆栈环境中,使读者对递归有更明晰的理解...
与同类教材相比,本书不仅提供了任何软件系统从设计、实现、测试到维护所需的基本概念,详尽地讨论了同类教材中少见的内存管理和数据压缩主题,还将对递归的讨论置于运行时堆栈环境中,使读者对递归有更明晰的理解...
(46) 面向对象的设计方法与传统的的面向过程的方法有本质不同,它的基本原理是(C) A. 模拟现实世界中不同事物之间的联系 B. 强调模拟现实世界中的算法而不强调概念 C. 使用现实世界的概念抽象地思考问题从而自然地...
与同类教材相比,本书不仅提供了任何软件系统从设计、实现、测试到维护所需的基本概念,详尽地讨论了同类教材中少见的内存管理和数据压缩主题,还将对递归的讨论置于运行时堆栈环境中,使读者对递归有更明晰的理解...
Windows操作系统的基本原理、NT驱动程序与WDM驱动程序的构造、驱动程序中的同步异步处理方法、驱 动程序中即插即用功能、驱动程序的各种调试技巧等。同时,还针对流行的PCI驱动程序、USB驱动程序 、虚拟串口驱动...
本书共分23章,内容涵盖了Windows操作系统的基本原理、NT驱动程序与WDM驱动程序的构造、驱动程序中的同步异步处理方法、驱动程序中即插即用功能、驱动程序的各种调试技巧等。同时,还针对流行的PCI驱动程序、USB驱动...
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 ...
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 ...
2.用两个栈实现一个队列的功能?要求给出算法和思路! 设2个栈为A,B, 一开始均为空. 入队: 将新元素push入栈A; 出队: (1)判断栈B是否为空; (2)如果不为空,则将栈A中所有元素依次pop出并push到栈B; (3)将栈B的...
还介绍了排序算法及数据结构的实现,包括链表、堆栈、队列和树。此外,本书开始用两章篇幅详细介绍了中英文面试的注意事项、常见问题及程序员的职业规划等软件工程师的常识。最后四章详细讲解了现在流行的智力测试题...
堆栈栈底设置在30H。 3.2 设计课题软件系统各模块功能简要介绍 本程序通过以下各子模块程序实现: 主程序、数码管显示子程序、定时1ms程序、定时10ms子程序、。 主程序:主要是用于对输入信号的处理、输出信号的控制...
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的启动与退出...