栈---顺序栈的实现

来源:互联网 发布:二战苏联单兵装备知乎 编辑:程序博客网 时间:2024/04/28 10:42

一、

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

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

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

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

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

二、顺序栈的实现

   顺序栈就是顺序储存结构的栈,它利用一组地址连续的储存单元依次存放从从栈底到栈顶的元素。栈底的位置保持不变,栈顶元素可以直接通过顺序栈的底层数组的数组元素array[size-1]来访问。

   顺序栈中数据元素的物理关系和逻辑关系是一致的,先进栈的元素位于栈底。

   (1)进栈

       1)将新的数据元素存入栈内(需要判断栈是否已满);

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

   (2)出栈

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

       2)释放数组对栈顶元素的引用;   

实现:

public class SquenceStack<T>{   private int DEFAULT_SIZE = 10;//数组初始化时的长度默认值   private int capacity;//保存数组的长度容量   private int capacityIncream;//   private Object[] elementData;//指向数组的引用变量   private int size;      public SquenceStack()//顺序栈地无参构造器   {   capacity = DEFAULT_SIZE;   elementData = new Object[capacity];   }    public  SquenceStack(T element)//以一个初始化元素来创建顺序栈 {  this();  elementData[0]=element;  size++; }  public  SquenceStack(T element,int intSize)//以一个初始化元素和初始化长度来创建一个顺序栈  {     this.capacity = intSize;     this.capacityIncream = intSize;     elementData = new Object[capacity];     elementData[0]=element;     size++;    }    public int length()//返回顺序栈的大小  {  return size++;  }    //入栈  把指定的元素压入栈中  public void push(T element)  {  ensureCapacity(size + 1);//压入前判断此时顺序栈是否已满,若满了进行扩容  elementData[size++] = element;   }    //判断数组容量是否已满 若满的话就进行扩容   private void ensureCapacity(int miniCapacity)   {   if(capacity < miniCapacity) //如果容量已经满了   {  if (capacityIncream > 0)  //若顺序栈在创建时指定了其初始长度 那么每次扩大其指定长度的长度,直到容量大于传进来的数值{while(capacity < miniCapacity){capacity += capacityIncream;}} else  //如果创建时没有指定容量大小,则容量大小每次右移一位(是原来的两倍),直到容量值大于传进来的值  {  while (capacity < miniCapacity){capacity <<= 1;}  }   }   }      //出栈  栈顶元素出栈   public T pop()   {   T oldValue = (T)elementData[size - 1];//把要出栈的元素赋值给oldValue   elementData[--size] = null;//把出栈的元素的引用指向空,释放栈顶元素的内存   return oldValue;   }      //返回栈顶元素但是不删除       public T peek()   {   return   (T)elementData[size - 1];     }      //判断栈是否为空   public boolean isEmpty()   {  return size == 0;   }      //将栈清空   public void clear()   {   Arrays.fill(elementData,null);//将底层数组中所有引用都指向空   size = 0;   }   @Override   public String toString()   {   if (size == 0)   {return "[]";   }   else   {   StringBuilder sb = new StringBuilder("[");    for (int i = size - 1; i >= 0; i--)   {   sb.append(elementData[i].toString() + ",");     }   int len  = sb.length();   return sb.delete(len-1,len).append("]").toString();      }   }}
测试:

public class SquenceStackTest{  public static void main(String[] args){SquenceStack<String> stack = new SquenceStack<String>();stack.push("hello");stack.push("world");stack.push("java");    System.out.println("访问栈顶元素:"+ stack.peek());    System.out.println("栈中所有元素:"+stack);    stack.pop();    System.out.println("出栈一个元素后栈中的元素:"+stack);    stack.clear();    System.out.println(stack);}}

结果:

访问栈顶元素:java
栈中所有元素:[java,world,hello]
出栈一个元素后栈中的元素:[world,hello]
[]

0 0