publicclassStack<E>{private E data[];privateint size;publicStack(int capacity){
data=(E[])newObject[capacity];
size=0;}publicStack(){this(10);}}
各种方法
时间复杂度均为O(1)[有的为均摊复杂度]
//入栈publicvoidpush(E e){if(size==data.length){resize(data.length*2);}
data[size]=e;
size++;}//出栈public E pop(){if(size==0)thrownewIllegalArgumentException("pop failed,stack is empty!");
E e=data[size-1];
size--;
data[size]=null;if(size==data.length/4&&data.length/2!=0){resize(data.length/2);}return e;}//查看栈顶元素public E peek(){if(size==0)thrownewIllegalArgumentException("peek failed,stack is empty!");elsereturn data[size-1];}publicbooleanisEmpty(){return size==0;}publicintgetSize(){return size;}publicintgetCapacity(){return data.length;}//变换容量privatevoidresize(int newCapacity){
E []newData=(E[])newObject[newCapacity];for(int i=0;i<size;i++){
newData[i]=data[i];}
data=newData;}
可以利用Array编写栈
栈中的数组可以用Array对象替代,这样就可以复用Array中已经编写好的函数了。
队列Queue(FIFO)
先进先出(first in first out)
接口
publicinterfaceQueue<E>{publicvoidenqueue(E e);//入队public E dequeue();//出队public E getFront();//查看队首publicintgetSize();publicbooleanisEmpty();}
//判断是否为空@OverridepublicbooleanisEmpty(){return tail==front;}//获取循环队列中元素的个数@OverridepublicintgetSize(){if(front<tail){return tail-front;}else{return data.length-front+tail;}}//获取实际能用的数组容量publicintgetCapacity(){return data.length-1;}//入队@Overridepublicvoidenqueue(E e){//判断条件(tail+1)%数组容量==front表示数组实际容量已满,需要扩容if((tail+1)%data.length==front){resize(getCapacity()*2+1);}
data[tail]=e;
tail=(tail+1)%data.length;}//出队,均摊时间复杂度为O(1)@Overridepublic E dequeue(){if(front==tail){thrownewIllegalArgumentException("cannot dequeue from an empty queue");}
E ret=data[front];
data[front]=null;
front=(front+1)%data.length;//空间浪费大,进行缩容if(getSize()==getCapacity()/4&&getCapacity()/2!=0){resize(getCapacity()/2+1);}return ret;}//查看队首元素@Overridepublic E getFront(){if(isEmpty()){thrownewIllegalArgumentException("cannot get first element from an empty queue");}return data[front];}//变换容量privatevoidresize(int newCapacity){
E[] newData=(E[])newObject[newCapacity];//让从front到tail-1中的元素全部复制到新数组中,有两种遍历方法(见toStirng()),用下面这种最方便for(int i=0;i<getSize();i++){
newData[i]=data[(i+front)%data.length];}
tail=getSize();
front=0;//不能写在更新tail和front语句前,因为getSize()要用到原来的数组信息
data=newData;}