C# · 12月 20, 2021

自定义栈

通过学习自定义栈,了解栈的数据结构。

首先写一个栈的接口,描述其具有的基本功能。Stack.java

然后写一个接口的实现类,这只是其中一种实现方式。ArrayStack.java

最后写一个测试类,测试自定义栈的效果。Test.java

整个栈的实现,借助了 自定义数组 这篇文章的类。Array.java

结构如下:

 Stack.java:

package algorithm;

public interface Stack {

/**

* 获取栈中数据的大小

* @return

*/

int getSize();

/**

* 判断栈是否为空

* @return

*/

boolean isEmpty();

/**

* 入栈

* @param e

*/

void push(E e);

/**

* 出栈

* @return

*/

E pop();

/**

* 查看栈顶元素

* @return

*/

E peek();

}

ArrayStack.java:

package algorithm;

public class ArrayStack implements Stack {

private Array array;//维护一个自定义的array数组。

/**

* 无参构造函数,调用array的无参构造函数,默认为10的 初始容量。

*/

public ArrayStack(){

array=new Array();

}

/**

* 带参构造函数,指定初始容量。

* @param capacity

*/

public ArrayStack(int capacity) {

array=new Array(capacity);

}

/**

* 获取栈的大小

*/

@Override

public int getSize() {

return array.getSize();

}

/**

* 判断栈是否为空

*/

@Override

public boolean isEmpty() {

return array.isEmpty();

}

/**

* 入栈

*/

@Override

public void push(E e) {

array.addLast(e);

}

/**

* 出栈

*/

@Override

public E pop() {

return array.removeLast();

}

/**

* 查看栈顶元素

*/

@Override

public E peek() {

return array.get(array.getSize()-1);

}

/**

* 重写Object的toString方法

*/

@Override

public String toString() {

StringBuilder sb=new StringBuilder();

sb.append(“Stack:[“);

for(int i=0;i

sb.append(array.get(i));

if(i!=array.getSize()-1) {

sb.append(“,”);

}

}

sb.append(“] top”);//表明最后是栈顶。

return sb.toString();

}

/**

* 自有的方法,获取栈的总容量。

* @return

*/

public int getCapacity() {

return array.getCapacity();

}

}

Test.java:

package algorithm;

public class Test {

public static void main(String[] args) {

Stack stack=new ArrayStack();

for(int i=0;i<5;i++) {

stack.push(i);

System.out.println(stack);

}

stack.pop();

System.out.println(stack);

}

}

控制台输出: