栈之链式存储结构链栈

链栈

栈的链式存储结构成为链栈。链栈是没有头结点,头结点就是栈顶指针top。

代码结构

package list;

  public interface Stackable;公共接口类

  public class Node;公共结点类

  class LinkedStack implements Stackable;实现栈接口的链栈类

  class TestLinkedStack;测试类

公共接口类

 package list;

 public interface Stackable<T> {

     public int Length();

     public boolean isEmpty();

     public boolean isFull();

     public boolean Push(T element);

     public T Pop();

 }

公共结点类

 package list;

 public class Node<T> {
private T data;
private Node<T> next; Node() {
this(null,null);
} Node(T data) {
this(data,null);
} Node(T data, Node<T> next) {
this.data = data;
this.next = next;
} public void setData(T data) {
this.data = data;
} public void setNext(Node<T> next) {
this.next = next;
} public T getData() {
return this.data;
} public Node<T> getNext() {
return this.next;
} public String toString() {
return getData();
}
}

实现栈接口的链栈类

 //链栈实现类,链栈没有头结点,当链栈为空表时,top = null;
class LinkedStack<T> implements Stackable<T> {
private Node<T> top; LinkedStack() {
this(null);
} //建链栈,element非空引用时,建带top的链栈
LinkedStack(T element) {
if(element != null) {
top = new Node<T>(element);
}
} //获取链栈,长度
public int Length() {
if(top == null) {return 0;}
else {
int k = 0;
Node<T> temp = top;
while(temp != null) {
k++;
temp = temp.getNext();
}
return k;
}
} //当top==null时,是空栈
public boolean isEmpty() {
return top == null;
} //链栈没有满栈的概念
public boolean isFull() {return false;} //压栈
public boolean Push(T element) {
if(element == null) return false;
Node<T> node = new Node<T>(element);
node.setNext(top);
top = node;
return true;
} //弹栈
public T Pop() {
if(isEmpty()) return null;
T temp = top.getData();
top = top.getNext();
return temp;
} //重写父类toString方法
public String toString() {
if(isEmpty()) return "[ ]";
int len = Length();
Node<T> temp = top;
StringBuffer sb = new StringBuffer("[ ");
while(temp != null) {
sb.append(temp.getData()+" ");
temp = temp.getNext();
}
sb.append("]");
return sb.toString();
}
}

测试类

 //*****************************************************************
//*栈之链式存储结构链栈-JAVA实现
//*@author Nora-Xie
//*@time 2013-10-06PM16:20
//*****************************************************************
package list; import list.Node; public class TestLinkedStack {
public static void main(String[] args) {
Stackable<String> stack = new LinkedStack<String>("A");
System.out.println(stack.Length());
System.out.println(stack);
stack.Push("B");
stack.Push("C");
System.out.println(stack.Length()+" "+stack);
stack.Pop();
System.out.println(stack.Length()+" "+stack);
}
}

链栈和顺序栈对比

顺序栈和链栈的插入、删除操作时间复杂度都是O(1);

顺序栈需要事先确定数组的长度,有可能存在浪费内存空间的情况;

链栈虽然不需要事先确定表长,但因为需要存储链式指针,同时加大了内存开销;

因此,如果数据元素变化不可预测,时大时小,最好使用链栈;如果它的变化空间在可控范围内,则可以考虑使用顺序栈。

java与数据结构(6)---java实现链栈的更多相关文章

  1. 【C#】【数据结构】006-栈:链栈

    C#数据结构:链栈 1.自定义链栈结构: 链栈节点类 using System.Collections; using System.Collections.Generic; using UnityEn ...

  2. 数据结构(C++)——链栈

    结点结构 typedef char ElemType; typedef struct LkStackNode{ ElemType data; LkStackNode *next; }*Stack,SN ...

  3. java与数据结构(8)---java实现链队列

    链队列 实际上就是单链表,只是规定了删除在队头进行,添加在队尾进行. 链队列代码结构 package list.queue; public interface Queuable<T>; p ...

  4. java与数据结构(4)---java实现双向循环链表

    线性表之链式存储结构双向循环链表 双向循环链表:每个结点包含了数据.直接前驱地址指针和直接后驱地址指针,头结点的直接前驱指向尾结点,尾结点的直接后驱指向头结点,头尾相连构成一个可正可反的圆环.可以形象 ...

  5. java与数据结构(3)---java实现循环链表

    循环链表:将单链表中尾结点的指针由空指针改为指向头结点,就使整个单链表形成一个环,这种首尾相接的单链表称为单链表循环表,即循环链表. 循环链表与单链表最重要的区别是:尾结点的指针,不再是p->n ...

  6. java与数据结构(2)---java实现静态链表

    结点类 1 //结点类 2 class Node<T> { 3 private T data; 4 private int cursor; 5 6 Node(T data, int cur ...

  7. 数据结构——Java实现链栈

    一.分析 栈是限定仅在表的一端进行插入或删除操作的线性表,对于栈来说,操作端称为栈顶,另一端则称为栈底,栈的修改是按照后进先出的原则进行的,因此又称为后进先出的线性表. 链栈是指采用链式存储结构实现的 ...

  8. java使用链栈实现迷宫求解

    java实现链栈在前面有所介绍:http://www.cnblogs.com/lixiaolun/p/4644141.html java实现链栈的代码: package stackapplicatio ...

  9. java使用链栈实现数制转换

    java实现链栈在前面有所介绍:http://www.cnblogs.com/lixiaolun/p/4644141.html 将前面java实现链栈的代码稍作修改: package linkedst ...

随机推荐

  1. JDKSDK配置

    变量名:ANDROID_HOME     变量值: E:\android-sdk_r11-windows\android-sdk_r11-windowsclsspath .;%JAVA_HOME%\l ...

  2. TinyXml高速入门(一)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 对于xml文件,眼下我的工作仅仅是集中在配置文件和作为简单的信息文件来用,因此我不太喜欢使用msxml这样的重量级的x ...

  3. js函数中变量的作用域

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  4. Linux系统最小化安装之后的系统基础环境安装以及内核优化脚本

    #!/bin/bash #添加epel和rpmforge的外部yum扩展源 cd /usr/local/src wget http://mirrors.ustc.edu.cn/fedora/epel/ ...

  5. java的练习

    import java.awt.GridLayout; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.s ...

  6. Repeater的ItemDataBound 事件中e.Item.DataItem 的数据类型

    1.使用DataSet和DataTable绑定数据源时 DataRowView view = (DataRowView)e.Item.DataItem; 2.DataReader绑定数据源时 Syst ...

  7. 批量执行插入的sql和自动补零

    DECLARE @invoice_no int SET @invoice_no=3 WHILE @invoice_no<=100 --需要插入的次数 BEGIN --此处需要执行的插入sql文 ...

  8. Linux下快速搭建DNS服务器

    一.术语解释:TTL Time To Live 缓冲保留时间ORIGIN 属于哪个域@ 代指域IN 开头需要空格SOA 一行记录类型的开始参数:forwarders {} 指向自己无法解析的域名跳转到 ...

  9. SQL函数:用于将小写的数值翻译成大写的字符串

    --功能:  用于将小写的数值翻译成大写的字符串(支持到分,即小数点后两位)       --入口参数:@decNum------数字型变量    --返回:字符串    --举例:select db ...

  10. vim 学习笔记

    vim介绍:一款编辑器,另外一般linux系统会自带,所以一般linux下日志.配置文件等 纯文本文件的修改编辑等通过vim操作 学会的好处:1 方便操作linux下日志.配置文件等纯文本文件 2 功 ...