Java栈实现
栈数组实现一:优点:入栈和出栈速度快,缺点:长度有限(有时候这也不能算是个缺点)
public class Stack {
private int top = -1;
private Object[] objs;
public Stack(int capacity) throws Exception{
if(capacity < 0)
throw new Exception("Illegal capacity:"+capacity);
objs = new Object[capacity];
}
public void push(Object obj) throws Exception{
if(top == objs.length - 1)
throw new Exception("Stack is full!");
objs[++top] = obj;
}
public Object pop() throws Exception{
if(top == -1)
throw new Exception("Stack is empty!");
return objs[top--];
}
public void dispaly(){
System.out.print("bottom -> top: | ");
for(int i = 0 ; i <= top ; i++){
System.out.print(objs[i]+" | ");
}
System.out.print("\n");
}
public static void main(String[] args) throws Exception{
Stack s = new Stack(2);
s.push(1);
s.push(2);
s.dispaly();
System.out.println(s.pop());
s.dispaly();
s.push(99);
s.dispaly();
s.push(99);
}
}
bottom -> top: | 1 | 2 |
2
bottom -> top: | 1 |
bottom -> top: | 1 | 99 |
Exception in thread "main" java.lang.Exception: Stack is full!
at Stack.push(Stack.java:17)
at Stack.main(Stack.java:44)
数据项入栈和出栈的时间复杂度都为常数O(1)
栈数组实现二:优点:无长度限制,缺点:入栈慢
import java.util.Arrays;
public class UnboundedStack {
private int top = -1;
private Object[] objs;
public UnboundedStack() throws Exception{
this(10);
}
public UnboundedStack(int capacity) throws Exception{
if(capacity < 0)
throw new Exception("Illegal capacity:"+capacity);
objs = new Object[capacity];
}
public void push(Object obj){
if(top == objs.length - 1){
this.enlarge();
}
objs[++top] = obj;
}
public Object pop() throws Exception{
if(top == -1)
throw new Exception("Stack is empty!");
return objs[top--];
}
private void enlarge(){
int num = objs.length/3;
if(num == 0)
num = 1;
objs = Arrays.copyOf(objs, objs.length + num);
}
public void dispaly(){
System.out.print("bottom -> top: | ");
for(int i = 0 ; i <= top ; i++){
System.out.print(objs[i]+" | ");
}
System.out.print("\n");
}
public static void main(String[] args) throws Exception{
UnboundedStack us = new UnboundedStack(2);
us.push(1);
us.push(2);
us.dispaly();
System.out.println(us.pop());
us.dispaly();
us.push(99);
us.dispaly();
us.push(99);
us.dispaly();
}
}
bottom -> top: | 1 | 2 |
2
bottom -> top: | 1 |
bottom -> top: | 1 | 99 |
bottom -> top: | 1 | 99 | 99 |
由于该栈是由数组实现的,数组的长度是固定的,当栈空间不足时,必须将原数组数据复制到一个更长的数组中,考虑到入栈时或许需要进行数组复制,平均需要复制N/2个数据项,故入栈的时间复杂度为O(N),出栈的时间复杂度依然为O(1)
栈单链表实现:没有长度限制,并且出栈和入栈速度都很快
public class LinkedList {
private class Data{
private Object obj;
private Data next = null;
Data(Object obj){
this.obj = obj;
}
}
private Data first = null;
public void insertFirst(Object obj){
Data data = new Data(obj);
data.next = first;
first = data;
}
public Object deleteFirst() throws Exception{
if(first == null)
throw new Exception("empty!");
Data temp = first;
first = first.next;
return temp.obj;
}
public void display(){
if(first == null)
System.out.println("empty");
System.out.print("top -> bottom : | ");
Data cur = first;
while(cur != null){
System.out.print(cur.obj.toString() + " | ");
cur = cur.next;
}
System.out.print("\n");
}
}
public class LinkedListStack {
private LinkedList ll = new LinkedList();
public void push(Object obj){
ll.insertFirst(obj);
}
public Object pop() throws Exception{
return ll.deleteFirst();
}
public void display(){
ll.display();
}
public static void main(String[] args) throws Exception{
LinkedListStack lls = new LinkedListStack();
lls.push(1);
lls.push(2);
lls.push(3);
lls.display();
System.out.println(lls.pop());
lls.display();
}
}
top -> bottom : | 3 | 2 | 1 |
3
top -> bottom : | 2 | 1 |
数据项入栈和出栈的时间复杂度都为常数O(1)
Java栈实现的更多相关文章
- 从几个sample来学习JAVA堆、方法区、JAVA栈和本地方法栈
最近在看<深入理解Java虚拟机>,书中给了几个例子,比较好的说明了几种OOM(OutOfMemory)产生的过程,大部分的程序员在写程序时不会太关注Java运行时数据区域的结构: 感觉有 ...
- java栈内存堆内存和GC相关
java栈内存堆内存 Java把内存分成两种,一种叫做栈内存,一种叫做堆内存,有着不同的作用.栈内存用来存储局部变量和方法调用.栈内存归属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属 ...
- JAVA栈帧
简介 Java栈是一块线程私有的内存空间.java堆和程序数据相关,java栈就是和线程执行密切相关的,线程的执行的基本行为是函数调用,每次函数调用的数据都是通过java栈来传递的. Java栈与数据 ...
- java虚拟机 jvm 出入java栈 栈空间内存分配
java栈空间是一块线程私有的内存空间,java堆和程序数据密切相关,那么java栈就是和线程执行密切相关.线程最基本的执行行为就是函数的调用.每次函数调用其实是通过java栈传递数据的. 数据结构中 ...
- java虚拟机 jvm java堆 方法区 java栈
java堆是java应用程序最密切的内存空间.几乎所有的对象都存在堆中.java堆完全自动化管理,通过垃圾回收机制,垃圾对象会自动清理,不需要显式释放. 根据java垃圾回收机制的不同,java堆可能 ...
- java 栈 最大深度
1. 概述 某公司面试,总监大叔过来,问了图论及栈的最大深度,然后^_^ 一直记着,今天搞一下 2. 代码 package com.goodfan.test; public class JavaS ...
- 【多线程】死锁与Java栈跟踪工具
今天面试有一道题,写一个死锁的程序,自己也是短路了,没写出来,回来写下. 死锁常见的情况是A线程持有a锁.阻塞于b锁,B线程持有b锁,阻塞于a锁,形成一个循环阻塞的状态. import java.ut ...
- java栈的最大深度?
1. 概述 某公司面试,总监大叔过来,问了图论及栈的最大深度,然后^_^ 一直记着,今天搞一下 2. 代码 package com.goodfan.test; public class JavaSta ...
- JVM(1)之 JAVA栈
开发十年,就只剩下这套架构体系了! >>> 若想使自己编写的Java程序高效运行,以及进行正确.高效的异常诊断,JVM是不得不谈的一个话题.本"JVM进阶"专 ...
- Java栈的实例模拟
前言: “后进先出”---是栈(Stack)这种数据结构最基本的特点.很多程序设计语言都具有封装好的Stack工具,本文就带领大家一起将栈温习一下并附上一个模拟栈的程序. Java内存分配中,每通过n ...
随机推荐
- 《Oracle Database 12c DBA指南》第一章 - 基本技能简介
当前关于12c的中文资料比较少,本人将关于DBA的一部分官方文档翻译为中文,很多地方为了帮助中国网友看懂文章,没有按照原文句式翻译,翻译不足之处难免,望多多指正. 1 基本技能简介 作为一个数据库管理 ...
- 多线程与网络之cookies
1. 网络请求中的cookie 1.1 删除cooki NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCook ...
- java双亲委派模型如何递归实现
以下是Classloader的中最重要的方法,也就是所谓的双亲委派模型.这个模型第一次在周志明的书上看到,当时看了只知道是类加载过程是首先是委托给父加载器,否则父不能加载,则自己加载,整个过程实则是一 ...
- 【暑假】[实用数据结构]UVAlive 3644 X-Plosives
UVAlive X-Plosives 思路: “如果车上存在k个简单化合物,正好包含k种元素,那么他们将组成一个易爆的混合物” 如果将(a,b)看作一条边那么题意就是不能出现环,很容易联想到K ...
- 微软CEO私享会——广东天使会专场圆满落幕
http://www.cnblogs.com/sennly/p/4140976.html 10月17日,微软中国联合广东天使会首期“微软CEO 私享会”在中国微软广东分公司广州太古汇办公室举 ...
- javascript设计模式6
单体模式:用来划分命名空间而组织一些方法和属性的对象,如果它能被实例化,只能被实例化一次:但对象不是单体 var Singleton={ attr1:true; attr2:2, method1:fu ...
- ltt.js
var dailyBox = $('.daily-box-office'), curDate = new Date(), curYear = curDate.getFullYear(), curMon ...
- position跟display、margin collapse、overflow、float这些特性相互叠加后会怎么样?
这是寒冬大神提出的一个题目,刚开始看到这题的时候完全不知道从什么地方回答起好,题目内容比较广泛,找不到针对点.后来我觉得这个题目应该能拆成几个点来回答:1.'display'.'position' 和 ...
- PowerDesigner实用技巧小结(4)
下述十四个技巧,是许多人在大量的数据库分析与设计实践中,逐步总结出来的.对于这些经验的运用,读者不能生帮硬套,死记硬背,而要消化理解,实事求是,灵活掌握.并逐步做到:在应用中发展,在发展中应用. 1. ...
- Linux下JDK安装位置
新手在Linux上安装JDK时,不知道应该将JDK安装在哪比较合适.首先简要了解下Linux中部分目录的作用. /bin---用来贮存用户命令./usr/bin 也被用来贮存用户命令. /sbin- ...