Java实现栈。

定义一个接口MyStack接口:

package Stack;

public interface MyStack<T> {
boolean isEmpty();
int length();
boolean push(T date);
T pop();
}

数组实现:

package Stack;

public class ArrayStack<T> implements MyStack<T>{
private Object[] objs = new Object[16];
// size相当于游标
private int size = 0;
public boolean isEmpty() {

return size==0;
}

@Override
public int length() {
// TODO Auto-generated method stub
return size;
}

@Override
public boolean push(T date) {
if(size>=objs.length){
resize();
}
objs[size]=date;
size++;
return true;
}

@Override
public T pop() {
if(size==0){
return null;
}

return (T) objs[--size];
}
public void resize(){
Object[] temp = new Object[objs.length*3/2+1];
for(int i=0;i<size;i++){
temp[i]=objs[i];
objs[i] = null;
}
objs=temp;
}
public String toString(){
StringBuffer sb= new StringBuffer();
sb.append("ArrayStack:[");
for(int i =0;i<size;i++){
sb.append(objs[i]);
if(i!=size-1){
sb.append(",");
}
}
sb.append("]");
return sb.toString();
}
}

链表实现:

package Stack;

public class LinkStack<T> implements MyStack<T> {
Node top=null;
int size=0;

@Override
public boolean isEmpty() {
// TODO Auto-generated method stub
return top==null;
}

@Override
public int length() {

return size;
}

@Override
public boolean push(T date) {
Node node = new Node();
node.date = date;
node.node = top;
top=node;
size++;
return true;
}

@Override
public T pop() {
if(size!=0){
Node node = top;
top=node.node;
size--;
return node.date;
}
return null;
}
class Node{
private Node node;
private T date;
}
}

测试:

/**
*
*/
package Stack;

import org.junit.Test;

/**
* @author zjj19960106
*
*/
public class TestSpeed {
class Person{
public Person(String name, int age) {
this.name=name;
this.age=age;
}
private String name;
private int age;
}
@Test
public void testSpeed() {
MyStack<Person> stack = new ArrayStack<Person>();
int num = 10000000;
long start = System.currentTimeMillis();
for (int i = 0; i < num; i++) {
stack.push(new Person("xing", 25));
}
long temp = System.currentTimeMillis();
System.out.println("push time: " + (temp - start));
while (stack.pop() != null) ;
System.out.println("pop time: " + (System.currentTimeMillis() - temp));
}

}

结果:链表的时间大于数组,栈的操作是对栈顶进行,所以使用数组也是O(1),不会出现数组中的元素移动位置,而使用栈每个数据还有进行封装成节点,所以时间比数组长。

时间: 2024-10-10 00:52:43

Java实现栈。的相关文章

JAVA虚拟机栈

JAVA虚拟机栈几个重要概念 java 虚拟机栈 = java virtual machine stacks = jvms 1.JVMS 线程私有,生命周期与线程相同 2.JVMS 描述的是JAVA方法执行的内存模型:JVMS在方法执行时会创建一个"栈帧" stack frame,用于记录局部变量表.操作数栈.动态链接.方法出口等,每一个方法从调用到完成的过程,就是一个栈帧在JVMS中入栈到出栈的过程 3.局部变量表存放基本数据类型.对象引用.returnAddress(字节码指令地址

Java虚拟机栈和本地方法栈

Java虚拟机栈的特征 线程私有 后进先出(LIFO)栈 存储栈帧,支持Java方法的调用.执行和退出 可能出现OutOfMemoryError异常和StackOverflowError异常 Java本地方法栈的特征 线程私有 后进先出(LIFO)栈 作用是支撑Native方法的调用.执行和退出 可能出现OutOfMemoryError异常和StackOverflowError异常 有一些虚拟机(如HotSpot)将Java虚拟机栈和本地方法栈合并实现 栈帧的概念和特征 Java虚拟机栈中存储的

Java中栈的两种实现

栈是先进后出的数据结构,主要有弹栈,入栈两种操作. 数组版 1 package stack; 2 3 /*** 4 * 栈的数组实现--java 5 * 栈是先进后出的数据结构,主要有弹栈,入栈两种操作 6 * 由于该栈是由数组实现的,数组的长度是固定的,当栈空间不足时, 7 * 必须将原数组数据复制到一个更长的数组中, 8 * 考虑到入栈时或许需要进行数组复制,平均需要复制N/2个数据项, 9 * 故入栈的时间复杂度为O(N),出栈的时间复杂度依然为O(1) 10 * @author bink

java的栈图形演示

1 import java.awt.*; 2 import javax.swing.*; 3 import java.awt.event.*; 4 /* 5 指示发生了组件定义的动作的语义事件.当特定于组件的动作(比如被按下)发生时,由组件(比如 Button)生成此高级别事件. 6 事件被传递给每一个 ActionListener 对象,这些对象是使用组件的 addActionListener 方法注册的,用以接收这类事件. 7 所以在给TextField类添加 ActionListener

java技术栈

java技术栈 1 java基础: 1.1 算法 1.1 排序算法:直接插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序 1.2 二叉查找树.红黑树.B树.B+树.LSM树(分别有对应的应用,数据库.HBase) 1.3 BitSet解决数据重复和是否存在等问题 1.2 基本 2.1 字符串常量池的迁移 2.2 字符串KMP算法 2.3 equals和hashcode 1.equals方法用于比较对象的内容是否相等(覆盖以后) 2.hashcode方法只有在集合中

Java函数调用栈

Java的函数调用栈就是Java虚拟机栈,它是线程私有的,与线程一同被创建,用于存储栈帧. 栈帧随着方法的调用而创建,随着方法的结束而销毁.可以说栈帧是方法的抽象. 于是,可以通过打印出Java虚拟机栈中的栈帧信息来了解函数调用过程.用于实现这个过程的Java代码如下: package methodcall; public class Methods { public void method1() { method2(); } public void method2() { method3();

Java Stack栈和Heap堆的区别

首先分清楚Stack,Heap的中文翻译:Stack—栈,Heap—堆. 在中文里,Stack可以翻译为“堆栈”,所以我直接查找了计算机术语里面堆和栈开头的词语: 堆存储: heapstorage 堆存储分配: heapstorage allocation 堆存储管理: heap storage management 栈编址: stack addressing 栈变换:stack transformation 栈存储器:stack memory 栈单元: stack cell 接着,总结在Jav

java数据结构栈

栈的原则是先进后出,比如一堆摞起来的书,后放上去的会被最先拿到. 栈的特点是每次只允许访问一个元素. 栈是一种抽象出来的数据结构,它的底层存储依赖于数组和链表,下面列出它的两种实现 public interface Stack <T>{ boolean isEmpty(); void clear(); int length(); boolean push(T obj); T pop(); boolean hashNext(); } public class ArrayStack<T>

java 虚拟机栈

与程序计数器一样,Java虚拟机栈也是线程私有的,他的生命周期与线程相同.虚拟机栈描述的是Java执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表,操作栈,动态链接,方法出口等信息.每个方法被调用直至执行完成的过程,就对应一个虚拟机栈由入栈到出栈的过程. 局部变量表存放了编译期可知的各种基本数据类型(boolean,byte,char,short,int,long,double),对象引用(reference类型,他不同于对象本身,根据不同的虚拟机实现,它可能是一个指向

java实现栈(可以无限put)

一直想用java实现栈.队列,可是没时间,马上要找实习了,就复习了一下算法,实现了一个简单的栈,代码还是有问题的,有兴趣的兄弟帮忙改正 问题:多线程的话pop和push只能有一个方法被执行需要加互斥变量 import java.util.Arrays; public class Stack<Item> { private transient Object[] data;// 存储数据 private int top;// 表示栈顶元素 private int oldCapacity; publ