1,栈是一种后进先出(last in first out)LIFO
2,基于自己实现的数组实现栈,下面是自己实现数组类
package com.dream21th.algorithmicdatastructure.stack;
/**
* @Auther: hp
* @Date: 2019/9/7 15:42
* @Description:
*/
public class MyExtendArray<E> {
private E[] datas;
private int size;
/**
* 创建有参构造函数,初始化数组容量
* @param capacity
*/
public MyExtendArray(int capacity){
datas=(E[])new Object[capacity];
size=0;
}
/**
* 构造无参函数,初始化数组容量
*/
public MyExtendArray(){
this(10);
}
public int getSize(){
return this.size;
}
public boolean isEmpty(){
return this.size==0;
}
/**
* 在指定索引位置加值
* @param index
* @param e
*/
public void add(int index,E e){
if(index<0 || index>this.size){
throw new IllegalArgumentException("index must between 0 and size");
}
if(this.size==datas.length){
resize(2*datas.length);
}
for(int position=size-1;position>=index;position--){
this.datas[position+1]=this.datas[position];
}
this.datas[index]=e;
this.size++;
}
private void resize(int newCapacity) {
E[] newDatas= (E[]) new Object[newCapacity];
for(int i=0;i<this.datas.length;i++){
newDatas[i]=this.datas[i];
}
this.datas=newDatas;
}
/**
* 在第一个位置加入元素
* @param e
*/
public void addFirst(E e){
this.add(0,e);
}
/**
* 在最后一个位置添加元素
* @param e
*/
public void addLast(E e){
this.add(size,e);
}
public E get(int index){
if(index<0 || index>=this.size){
throw new IllegalArgumentException("index must between 0 and size");
}
return this.datas[index];
}
public void set(int index,E e){
if(index<0 || index>=this.size){
throw new IllegalArgumentException("index must between 0 and size");
}
this.datas[index]=e;
}
public boolean contain(E e){
for(int i=0;i<size;i++){
if(this.datas[i].equals(e)){
return true;
}
}
return false;
}
public int find(int e){
for(int i=0;i<size;i++){
if(this.datas[i].equals(e)){
return i;
}
}
return -1;
}
public E remove(int index){
if(index<0 || index>=this.size){
throw new IllegalArgumentException("index must between 0 and size");
}
E ret=this.datas[index];
for(int i=index+1;i<size;i++){
this.datas[i-1]=this.datas[i];
}
size--;
this.datas[size]=null;
if(this.size==this.datas.length/2){
resize(this.datas.length/2);
}
return ret;
}
public E removeFirst(){
return remove(0);
}
public E removeLast(){
return remove(size-1);
}
public E getLast(){
return get(this.size-1);
}
public E getFirst(){
return get(0);
}
public int getCapacity(){
return this.datas.length;
}
@Override
public String toString() {
StringBuilder builder=new StringBuilder();
builder.append(String.format("Array: size = %d,capacity = %d \n",this.size,this.datas.length));
builder.append("[");
for(int i=0;i<size;i++){
builder.append(this.datas[i]);
if(i!=size-1){
builder.append(",");
}
}
builder.append("]");
return builder.toString();
}
}
|
3,栈的实现
package com.dream21th.algorithmicdatastructure.stack;
/**
* @Auther: hp
* @Date: 2019/9/8 10:41
* @Description:
*/
public interface Stack<E> {
int getSize();
boolean isEmpty();
void push(E e);
E pop();
E peek();
}
|
package com.dream21th.algorithmicdatastructure.stack;
/**
* @Auther: hp
* @Date: 2019/9/8 10:55
* @Description:
*/
public class ArrayStack<E> implements Stack<E> {
private MyExtendArray<E> myExtendArray;
public ArrayStack(int capacity){
myExtendArray=new MyExtendArray<>(capacity);
}
public ArrayStack(){
this(10);
}
@Override
public int getSize() {
return myExtendArray.getSize();
}
@Override
public boolean isEmpty() {
return myExtendArray.isEmpty();
}
@Override
public void push(E e) {
myExtendArray.addLast(e);
}
@Override
public E pop() {
return myExtendArray.removeLast();
}
@Override
public E peek() {
return myExtendArray.getLast();
}
public int getCapacity(){
return myExtendArray.getCapacity();
}
@Override
public String toString() {
StringBuilder builder=new StringBuilder();
builder.append(String.format("Stack: size = %d, capacity = %d \n",getSize(),getCapacity()));
builder.append("[");
for(int i=0;i<getSize();i++){
builder.append(myExtendArray.get(i));
if(i!=getSize()-1){
builder.append(",");
}
}
builder.append("] top");
return builder.toString();
}
}
|
4,时间复杂度分析
由于都是在数据末尾进行操作,进栈和出栈的空间复杂度都是O(n)。