java与数据结构(6)---java实现链栈
栈之链式存储结构链栈
链栈
栈的链式存储结构成为链栈。链栈是没有头结点,头结点就是栈顶指针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实现链栈的更多相关文章
- 【C#】【数据结构】006-栈:链栈
C#数据结构:链栈 1.自定义链栈结构: 链栈节点类 using System.Collections; using System.Collections.Generic; using UnityEn ...
- 数据结构(C++)——链栈
结点结构 typedef char ElemType; typedef struct LkStackNode{ ElemType data; LkStackNode *next; }*Stack,SN ...
- java与数据结构(8)---java实现链队列
链队列 实际上就是单链表,只是规定了删除在队头进行,添加在队尾进行. 链队列代码结构 package list.queue; public interface Queuable<T>; p ...
- java与数据结构(4)---java实现双向循环链表
线性表之链式存储结构双向循环链表 双向循环链表:每个结点包含了数据.直接前驱地址指针和直接后驱地址指针,头结点的直接前驱指向尾结点,尾结点的直接后驱指向头结点,头尾相连构成一个可正可反的圆环.可以形象 ...
- java与数据结构(3)---java实现循环链表
循环链表:将单链表中尾结点的指针由空指针改为指向头结点,就使整个单链表形成一个环,这种首尾相接的单链表称为单链表循环表,即循环链表. 循环链表与单链表最重要的区别是:尾结点的指针,不再是p->n ...
- java与数据结构(2)---java实现静态链表
结点类 1 //结点类 2 class Node<T> { 3 private T data; 4 private int cursor; 5 6 Node(T data, int cur ...
- 数据结构——Java实现链栈
一.分析 栈是限定仅在表的一端进行插入或删除操作的线性表,对于栈来说,操作端称为栈顶,另一端则称为栈底,栈的修改是按照后进先出的原则进行的,因此又称为后进先出的线性表. 链栈是指采用链式存储结构实现的 ...
- java使用链栈实现迷宫求解
java实现链栈在前面有所介绍:http://www.cnblogs.com/lixiaolun/p/4644141.html java实现链栈的代码: package stackapplicatio ...
- java使用链栈实现数制转换
java实现链栈在前面有所介绍:http://www.cnblogs.com/lixiaolun/p/4644141.html 将前面java实现链栈的代码稍作修改: package linkedst ...
随机推荐
- udp协议基础(转自疯狂java讲义)
第17章 网络编程 17.4 基于UDP协议的网络编程 UDP协议是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket,但这两个Socket之间并没有虚拟链路,这两个Socket只是发 ...
- Android(java)学习笔记257:JNI之helloword案例(利用NDK工具)
1.逻辑思路过程图: 2.下面通过一个HelloWorld案例来说明一下JNI利用NDK开发过程(步骤) 分析:我们在Win7系统下编译的C语言代码,我们知道C语言依赖操作系统,不能跨平台,所以我们要 ...
- yii console.php 报错 Property "CConsoleApplication.theme" is not defined.
默认配置的话,是不会出现这个错误的,应该是有人为修改了 yiic.php 这个文件,本来是 $config 载入的应该是 console.php ,人为修改后载入了 main.php 这个配置文件了 ...
- hdu 2104
#include <iostream> using namespace std; int gcd(int a,int b) { return (b?gcd(b,a%b):a); } int ...
- C#判断程序是否以管理员身份运行,否则以管理员身份重新打开
/// <summary> /// 判断程序是否是以管理员身份运行. /// </summary> public static bool IsRunAsAdmin() { Wi ...
- Jquery插件 easyUI属性汇总
属性分为CSS片段和JS片段. CSS类定义:1.div easyui-window 生成一个window窗口样式. 属性如下: 1)mod ...
- 用css3实现闪烁效果
1. css3 @keyframes 参考 css3 @keyframes规则. 特别注意浏览器支持: Internet Explorer 10, Firefox, 和 Opera 支持 @keyfr ...
- oracle单行函数之数字函数
round--四舍五入函数 trunc--截断函数 mod--求余函数 round和trunc除了可以操作数字外还可以操作日期. Demo SQL),),),),) from dual ; ) ) ) ...
- html5 js跨域
介绍 当我们使用XMLHttpRequest发送请求时,浏览器发现该请求不符合同源策略,会给该请求加一个请求头:Origin,后台进行一系列处理,如果确定接受请求则在返回结果中加入一个响应头:Acce ...
- 2016最新一元云购完整源码 云购CMS系统 带安卓和ios手机客户端 源码免费分享
原文转自:http://www.zccode.com/thread-724-1-1.html 该资源说明: 看起来不错的一套一元云购CMS源码,源码包里面带了安卓和ios手机客户端,手机客户端需要自己 ...