3.2_栈_链式存储结构(链表形式)
【链式存储结构】
栈的链式存储结构,简称链栈。
【具体实现】
package com.Higgin.LinkStack; import java.util.EmptyStackException; /** * 使用链表的形式实现栈 */ public class MyStack { /** * 结点内部类 */ class Node{ private Object obj; //数据域 private Node next; //指针域 public Node(Object obj, Node next) { this.obj = obj; this.next = next; } public Node(Object obj){ this(obj,null); } public Node(){ this(null,null); } } private Node top; //栈顶指针 private int count; //栈含有的对象数量 public MyStack(){ this.top=new Node(); this.count=0; } /** * 返回栈中的已存的元素个数 */ public int size(){ return this.count; } /** * 判断是否为空栈 */ public boolean empty(){ return count==0; } /** * 插入对象obj为新的栈顶对象 */ public void push(Object obj){ Node newNode=new Node(obj); newNode.next=top; //把当前的栈顶元素赋值给新结点的直接后继 top=newNode; //然后将新结点newNode赋值给栈顶指针 this.count++; } /** * 获取栈顶的节点 */ public Node peekNode(){ if(size()==0){ throw new EmptyStackException(); } return top; } /** * 获取栈顶元素,但不删除 */ public Object peek(){ if(size()==0){ throw new EmptyStackException(); } return top.obj; } /** * 出栈,返回被弹出的节点的数据域对象 */ public Object pop(){ Object oldObj=peek(); //获取栈顶 里面包含了是否为空栈的判断 Node oldNode=top; top=top.next; this.count--; oldNode.obj=null; oldNode.next=null; return oldObj; } /** * 查找对象的位置,查找的是pop返回1,没有0 */ public int search(Object obj){ if(size()==0){ throw new EmptyStackException(); } Node curNode=top; int i=1; while(curNode.next!=null){ if(obj.equals(curNode.obj)){ return i; } curNode=curNode.next; i++; } return -1; } }
【测试】
package com.Higgin.LinkStack; public class TestMyStack { public static void main(String[] args) { MyStack ms=new MyStack(); System.out.println("是否为空==="+ms.empty()); //true ms.push(11); ms.push(22); ms.push(33); System.out.println("最近一次添加的是33==="+ms.peek()); //33 ms.push(44); ms.push(55); System.out.println("最近一次添加的是55==="+ms.peek()); //55 System.out.println("寻找22的位置==="+ms.search(22)); //4 ms.push(22); System.out.println("寻找22的位置==="+ms.search(22)); //1 System.out.println("寻找55的位置==="+ms.search(55)); //1 System.out.println("寻找99的位置(不存在)==="+ms.search(99)); //-1 ms.pop(); System.out.println("执行了一次pop,栈顶的元素==="+ms.peek()); //44 System.out.println("栈移除了之后的长度为===="+ms.size()); //4 } }
【运行结果】