栈---链式栈的实现

来源:互联网 发布:windows网络命令 编辑:程序博客网 时间:2024/05/16 12:52

一、

(1)栈是在一种特殊的线性表,它代表只能在某一端进行插入、删除操作,通常在线性表的尾端进行插入、删除操作.

(2)对于栈而言,通常允许插入、删除操作的一端被称为栈顶(top),另一端被称为栈底(buttom.

(3)从栈顶压入元素称为进栈(push.

(4)从栈顶删除元素称为出栈(pop.

栈是一种先进后出的线性表.

二、

可以采用单链表来保存栈中的所有元素,这种结构的栈被称为链栈。

对于链栈而言,栈顶元素不断改变,程序只要使用一个top引用来记录当前的栈顶元素即可。top引用变量永远引用栈顶元素,再使用一个size变量来记录当前栈内元素个数。

(1)进栈

1)top引用指向新添加的节点,新节点的next指向原来的栈顶;

2)记录栈内元素个数的变量+1

(2)出栈

   1)让top指向原来栈顶的下一个节点;

   2)释放原来栈顶的next引用;

   3)让记录栈内元素个数的变量-1

 

public class LinkStack<T>{//定义节点类  private class Node  { private T data;     private Node next;public Node()  {    }  public Node(T data,Node next)  {  this.data = data;  this.next = next;  }  }  private Node top;  private int size;  public LinkStack()//链栈的无参构造器  {  top = null;  }  public LinkStack(T element)  {  top = new Node(element,null);  size++;  }  public int length()//返回链栈的长度  {  return size;  }    //进栈  public void push(T element)  {  top = new Node(element,top);//让top 指向压入的新节点  size++;  }    //出栈  public T pop()  {  Node oldTop = top;//让oldTop指向要出栈的栈顶节点  top = top.next;//top指向原来栈顶的下一个节点  oldTop.next = null;//释放原栈顶的next的引用  size--;  return oldTop.data;    }  //访问栈顶元素  public T peek()  {  return top.data;  }    //判断栈是否为空  public boolean isEmpty()  {  return size == 0;  }    //清空栈  public void clear()  {  top = null;  size = 0;  }   public String toString()   {   if(isEmpty())   {   return "[]";   }   else   {   StringBuilder sb = new StringBuilder("[");   for (Node current =top; current != null; current = current.next){sb.append(current.data.toString()+",");}   int len = sb.length();return   sb.delete(len-1,len).append("]").toString();   }   }
测试

public class LinkStackTest{   public static void main(String[] args){LinkStack<String> linkstack = new LinkStack<String>();linkstack.push("hello");linkstack.push("world");linkstack.push("111");System.out.println(linkstack);System.out.println(linkstack.peek());linkstack.pop();System.out.println(linkstack);linkstack.clear();System.out.println(linkstack);}}

结果:

[111,world,hello]
111
[world,hello]
[]


0 0