链栈

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

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(){
    }
}

 



posted @ 2019-01-13 13:21  考拉熊_12  阅读(330)  评论(0编辑  收藏  举报