Java中栈的两种实现

栈是先进后出的数据结构,主要有弹栈,入栈两种操作。

数组版

  1 package stack;
  2
  3 /***
  4  * 栈的数组实现--java
  5  * 栈是先进后出的数据结构,主要有弹栈,入栈两种操作
  6  * 由于该栈是由数组实现的,数组的长度是固定的,当栈空间不足时,
  7  * 必须将原数组数据复制到一个更长的数组中,
  8  * 考虑到入栈时或许需要进行数组复制,平均需要复制N/2个数据项,
  9  * 故入栈的时间复杂度为O(N),出栈的时间复杂度依然为O(1)
 10  * @author bink
 11  *
 12  */
 13 public class Stack_Array {
 14     private Object[] stack;//容器
 15     private static final int INIT_SIZE = 2;//栈的默认大小
 16     private int index;//栈顶索引
 17
 18     /**
 19      * 初始化栈_默认构造方法
 20      */
 21     public Stack_Array(){
 22         stack = new Object[INIT_SIZE];
 23         index = -1;
 24     }
 25
 26     /**
 27      * 初始化栈,自定义长度
 28      */
 29     public Stack_Array(int init_size){
 30         if(init_size<0){
 31             throw new RuntimeException();
 32         }
 33         stack = new Object[init_size];
 34         index = -1;
 35     }
 36
 37     /**
 38      * 判断栈是否为空
 39      * @return
 40      */
 41     public boolean isEmpty(){
 42         return index==-1;
 43     }
 44
 45     /**
 46      * 判断是都栈满
 47      * @return
 48      */
 49     public boolean isFull(){
 50         return index>=stack.length-1;
 51     }
 52
 53     /**
 54      * 入栈
 55      * @param obj
 56      */
 57     public synchronized void push(Object obj){
 58         if(isFull()){
 59             //动态扩容
 60             Object[] temp = stack;
 61             stack = new Object[stack.length*2];
 62             System.arraycopy(temp, 0, stack, 0, temp.length);
 63         }
 64         stack[++index] = obj;
 65     }
 66
 67     /**
 68      * 查看栈顶元素
 69      * @return
 70      */
 71     public Object peek(){
 72         if(!isEmpty()){
 73             return stack[index];
 74         }
 75         return null;
 76     }
 77
 78     /**
 79      * 出栈
 80      * @return
 81      */
 82     public synchronized Object pop(){
 83         if(!isEmpty()){
 84             Object obj = peek();
 85             stack[index--] = null;
 86             return obj;
 87         }
 88         return null;
 89     }
 90
 91     public static void main(String[] args) {
 92         Stack_Array stack = new Stack_Array();
 93         for(int i=0;i<100;i++){
 94             stack.push("stack"+i);
 95         }
 96         for(int i=0;i<100;i++){
 97             System.out.println(stack.pop());
 98         }
 99     }
100 }

链表版

 1 package stack;
 2
 3 /**
 4  * 栈的链表实现--java
 5  * @author bink
 6  *
 7  * @param <T>
 8  */
 9 public class LindedStack<T> {、
10     private class Node<T>{
11         //指向下一个节点
12         Node next;
13         //本节点存储的元素
14         T date;
15     }
16
17     //栈中存储的元素的数量
18     private int count;
19     //栈顶元素
20     private Node<T> top;
21
22     public LindedStack(){
23         count = 0;
24         top = null;
25     }
26
27     /**
28      * 判断是都为空
29      * @return true为空
30      */
31     public boolean isEmpty(){
32         return count==0;
33     }
34
35     /**
36      * 入栈
37      * @param element
38      */
39     public void push(T element){
40         Node<T> node = new Node<T>();//链表节点
41         node.date = element;//链表节点数据
42         node.next = top;//链表下一步节点
43         top = node;//现在的栈顶
44         count++;//栈数量
45     }
46
47     /**
48      * 出栈
49      * @return
50      */
51     public T pop(){
52         if(isEmpty()){
53             throw new RuntimeException();
54         }
55         T result = top.date;
56         top = top.next;
57         count--;
58         return result;
59     }
60
61     /**
62      * 获取栈顶
63      * @return
64      */
65     public T peek(){
66         if(isEmpty()){
67             throw new RuntimeException();
68         }
69         return top.date;
70     }
71
72     public static void main(String[] args) {
73         LindedStack<String> lind = new LindedStack<String>();
74         for(int i=0;i<10;i++){
75             lind.push("LindedStack"+i);
76         }
77         for(int i=0;i<10;i++){
78             System.out.println(lind.pop());
79         }
80     }
81 }
时间: 2024-12-20 06:01:07

Java中栈的两种实现的相关文章

简述java中抛出异常的两种方式

java编程中经常遇到异常,这时就需要利用java中的异常抛出机制,在java中提供了两种抛出异常的方法:try{}  catch() {}和throw. 一.抛出异常的两种方式 (1) 首先我们来看一下try()  catch(){}这种方式: ? 1 2 3 4 5 6 try{    i=9\0; } catch(exception e) {     system.out.println("除数不能为0"): } 该种方式是将待执行的代码放入try中,如果执行的代码发生异常就会被

述java中抛出异常的两种方式

java编程中经常遇到异常,这时就需要利用java中的异常抛出机制,在java中提供了两种抛出异常的方法:try{}  catch() {}和throw. 一.抛出异常的两种方式 (1) 首先我们来看一下try()  catch(){}这种方式: ? 1 2 3 4 5 6 try{    i=9\0; } catch(exception e) {     system.out.println("除数不能为0"): } 该种方式是将待执行的代码放入try中,如果执行的代码发生异常就会被

java中线程分两种,守护线程和用户线程。

java中线程分为两种类型:用户线程和守护线程. 通过Thread.setDaemon(false)设置为用户线程: 通过Thread.setDaemon(true)设置为守护线程. 如果不设置次属性,默认为用户线程. 区别:主线程结束后用户线程会继续运行,JVM存活:主线程结束后,如果没有用户线程,都是守护线程,则JVM结束. public class Mytest extends Thread { public void run() { for(int i=0;;i++){ try { Th

java中super 的两种用法

通过用 static 来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说它类似于 C 语言中的全局函数和全局变量.但是,并不是说有了这种便利,你便可以随处使用,如果那样的话,你便需要认真考虑一下自己是否在用面向对象的思想编程,自己的程序是否是面向对象的. 好了,现在开始讨论 this&super 这两个关键字的意义和用法. 在 Java 中, this 通常指当前对象, super 则指父类的.当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便可以利用

Java中String的两种赋值方式的区别

本文修改于:https://www.zhihu.com/question/29884421/answer/113785601 前言:在java中,String有两种赋值方式,第一种是通过"字面量"赋值,如:String str="hello",第二种是通过new关键字创建新对象,如:String str=new String("hello").那么这两种赋值的方式到底有什么区别呢,下面给出具体分析. 1.首先回顾Java虚拟机的结构图. 在上面的

细说java中Map的两种迭代方式

以前对java中迭代方式总是迷迷糊糊的,今天总算弄懂了,特意的总结了一下,基本是算是理解透彻了. 1.再说Map之前先说下Iterator: Iterator主要用于遍历(即迭代访问)Collection集合中的元素,Iterator也称为迭代器.它仅仅只有三个方法:hasNext(),next()和remove() hasNext():如果仍有元素可以迭代,则返回 true.(换句话说,如果 next 返回了元素而不是 抛出异常,则返回 true). next():返回迭代的下一个元素. re

Java中异常的两种处理方式

异常处理的两种方式: 声明抛出 throws  声明抛出的位置:是在方法声明的位置上使用throws关键字向上抛出异常. 捕捉 try....catch.. public class ExceptionTest03{     public static void main(String[] args){     //创建文件输入流读取文件     //思考:java编译器是如何知道以下的代码执行过程中可能出现异常,     //java编译器是如何知道这个异常发生的几率比较高呢?    //ja

java中super的两种用法

转自:http://blog.csdn.net/yihuei123/archive/2007/06/04/1637893.aspx 通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说它类似于C语言中的全局函数和全局变量.但是,并不是说有了这种便利,你便可以随处使用,如果那样的话,你便需要认真考虑一下自己是否在用面向对象的思想编程,自己的程序是否是面向对象的. 好了,现在开始讨论this&super这两个关键字的意义和用法. 在Java中,this通常指当前对象,su

java 中 return 的两种常见的用法

一:return语句总是用在方法中,有两个作用: 一个是返回方法指定类型的值(这个值总是确定的), 一个是结束方法的执行(仅仅一个return语句). 二:实例1 -- 返回一个String private String gets(){ String s = "qw789" ; return s ; } 实例2 -- 结束程序 private void gets(String s ){ if ( s == null ){ return ; } System.out.println( &