zoukankan      html  css  js  c++  java
  • 链栈

    链栈是栈的链式存储结构。栈只是栈顶进行插入和删除操作,那么栈顶放在单链表的头部还是尾部呢?由于单链表有头指针,栈顶指针也是必须的,所以可以将二者合二为一,即把栈顶放在单链表的头部

    1.链栈的结构定义

    class StackNode{
        Object data;
        StackNode next;
        public StackNode(){
        }
        @Override
        public String toString() {
            return "StackNode [data=" + data + ", next=" + next + "]";
        }
    }
    class LinkStack{
        StackNode top;
        int count;
        public LinkStack(){
        }
    }
    

    2.链栈的进栈操作

    算法思路:
        1. 将要新插入的数据元素的next指向当前的栈顶元素;
        2. 将新的数据元素作为栈顶元素;

    代码实现:

    public static void pushLinkStack(LinkStack linkStack,Object e){
        //入栈的新数据元素
        StackNode newStackNode=new StackNode();
        newStackNode.data=e;
        //新数据元素的next指向当前的栈顶元素;
        newStackNode.next=linkStack.top;
        //将新数据元素作为栈顶元素
        linkStack.top=newStackNode;
        linkStack.count=linkStack.count+1;
    }    
    

    3.链栈的出栈操作

    算法思路:
        1. 将栈顶结点内的数据赋值给e,打印要出栈的数据元素;
        2. 使得栈顶指针下移一位,指向后一结点,即该结点为新的栈顶结点。

    代码实现:

    public static void popLinkStack(LinkStack linkStack){
        if(linkStack.top==null){
            System.out.println("栈内没有数据");
        }else{
            Object e=linkStack.top.data;
            System.out.println("出栈元素为:"+e);
            linkStack.top=linkStack.top.next;
            linkStack.count=linkStack.count-1;
        }
    }
    

    时间复杂度分析:链栈的进栈和出栈操作非常简单,时间复杂度均为O[1]。

    4.顺序栈和链栈的比较

    二者的时间复杂度都为O[1],对于空间性能,顺序栈需要事先确定一个固定大小的数组空间,可能会存在内存空间浪费的问题,但是存取时定位很方便。链栈则要求每个元素都有指针域,增加了内存空间,但对于栈的长度没有限制。
    如果数据元素变化不太大,那么使用顺序栈比较好,如果使用过程中数据元素变化很大,使用链栈比较好。

    完整代码:

    package com.java.Stack;
    public class LinkStackTest {
        public static void main(String[] args){
            LinkStack ls=new LinkStack();
            pushLinkStack(ls,"S");
            pushLinkStack(ls,"A");
            popLinkStack(ls);
            popLinkStack(ls);
            popLinkStack(ls);
        }
        //出栈操作
        public static void popLinkStack(LinkStack linkStack){
            if(linkStack.top==null){
                System.out.println("栈内没有数据");
            }else{
                Object e=linkStack.top.data;
                System.out.println("出栈元素为:"+e);
                linkStack.top=linkStack.top.next;
                linkStack.count=linkStack.count-1;
            }
        }
        //进栈操作
        public static void pushLinkStack(LinkStack linkStack,Object e){
            //入栈的新数据元素
            StackNode newStackNode=new StackNode();
            newStackNode.data=e;
            //新数据元素的next指向当前的栈顶元素;
            newStackNode.next=linkStack.top;
            //将新数据元素作为栈顶元素
            linkStack.top=newStackNode;
            linkStack.count=linkStack.count+1;
        }    
    }
    class StackNode{
        Object data;
        StackNode next;
        public StackNode(){
        }
        @Override
        public String toString() {
            return "StackNode [data=" + data + ", next=" + next + "]";
        }
    }
    class LinkStack{
        StackNode top;
        int count;
        public LinkStack(){
        }
    }
    



  • 相关阅读:
    jQuery的遍历方法
    xampp配置host和httpd可以随意访问任何本机的地址
    JavaScript的this简单实用
    移动端rem布局和百分比栅格化布局
    你知道用AngularJs怎么定义指令吗?
    谈谈Angular关于$watch,$apply 以及 $digest的工作原理
    深入了解Angularjs指令中的ngModel
    如何将angularJs项目与requireJs集成
    requireJS(二)
    requireJS(一)
  • 原文地址:https://www.cnblogs.com/naihuangbao/p/10262377.html
Copyright © 2011-2022 走看看