1.什么是链栈
1.链栈的结构和链表相似
2.插入与删除等操作都是在链表的头部
3.即:链栈是一个以top为头结点、从栈顶指向栈底的单链表
2.链栈的优缺点
解决了栈空间大小固定的弊端。
3.实现思路和注意要点
因为链栈本质上还是一个单链表,是由一个个结点组成的链表,所以还是采用内部类的方式实现。创建一个Node类,定义了Node next用来存放上一个入栈的结点的首地址和String data用来存放当前入栈的数据;在外部Stack类定义对Node的操作方法,入栈,弹栈等。外部类不能实例化内部类。
1.在Stack类里面要定义一个count,用来计数栈中结点的个数,定义一个 Node top,是对象的引用,用于指向栈顶结点。
2.入栈操作,调用入栈方法,就需要申请一个结点,调用Node的有参构造方法,将数据data传入进去,然后将top存储的头结点地址赋值给node.next,这样新增加的节点就指向了它前一个入栈的结点,最后再将新入栈的结点的首地址赋值给top,这样top就更新了,指向了新的头结点。
3.弹栈操作,需要将top指向弹栈结点的下一个结点,这里需要注意的是,一定要定义一个中间变量用来暂存当前top的值,返回弹栈数据冲突。
Stack类:
1 package chainStack; 2 /** 3 * @类名 stack.java 4 * @作者 修仙小华 5 * @版本 V1.0 6 * @日期 2019年7月24日-上午9:13:10 7 * @描述 8 * 9 */ 10 public class Stack { 11 int count=0; 12 Node top; 13 14 public void push(String data) { 15 Node node=new Node(data); 16 node.next=top; 17 count++; 18 top=node; 19 } 20 public String peek() { 21 return top.data; 22 } 23 public String pop() { 24 Node temp=top; 25 if (top.next==null) { 26 top=null; 27 }else { 28 top=top.next; 29 } 30 this.count--; 31 return temp.data; 32 } 33 public int size() { 34 return this.count; 35 } 36 public boolean isEmpaty() { 37 if (top==null) { 38 return true; 39 }else { 40 return false; 41 } 42 } 43 class Node{ 44 String data; 45 Node next; 46 public Node() {} 47 public Node(String data) { 48 this.data=data; 49 } 50 } 51 }
测试类:
1 public class StackTest { 2 public static void main(String[] args) { 3 Stack sta=new Stack(); 4 sta.push("张三"); 5 sta.push("李四"); 6 sta.push("王二"); 7 sta.push("麻子"); 8 System.out.println(sta.pop()); 9 System.out.println(sta.peek()); 10 System.out.println(sta.isEmpaty()); 11 System.out.println(sta.size()); 12 13 } 14 15 }