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