上节说了Stack结构的特点,以及在java中是如何实现的。java代码中Stack实现原理
通过上面这篇文章可以知道,Stack是继承了Vector类,也就是列表,而Vector的底层结构中,其实是维护了一个数组的。
那么现在我们直接用自己写的数组类来实现一下栈的结构吧。
package com.it.data;
public class Stack<T> {
//用于内部维护的数组
private Array<T> arr;
//无参构造函数
public Stack(){
arr = new Array<>();
}
//有参构造函数
public Stack(int capacity){
//调用数组的构造方法
arr = new Array<>(capacity);
}
/**
* 压栈方法
* @param t
* @throws Exception
*/
public void push(T t)throws Exception{
arr.addLast(t);
}
/**
* 弹栈方法
* @return
* @throws Exception
*/
public T pop()throws Exception{
T t = arr.get(arr.getSize()-1);
arr.remove();
return t;
}
/**
* 查找栈顶元素
* @return
*/
public T peek() throws Exception{
return arr.get(arr.getSize()-1);
}
/**
* 查找元素对应位置
* @param t
* @return
*/
public int search(T t){
return arr.getIndex(t);
}
}
就一样,一个简单的栈结构就基于自己写的数组结构形成了。当然,也可以不适用自己增强的数组,通过自己维护size和capacity,用最基础的数组来实现。
package com.it.data;
public class Stack2<T>{
private T[] data;
private int size;
private int incCapacity;
public int getCapacity(){
return data.length;
}
public int getSize(){
return size;
}
public Stack2(){
data = (T[])new Object[16];
}
public Stack2(int capacity){
data =(T[]) new Object[capacity];
}
public Stack2(int capacity,int incCapacity){
data = (T[]) new Object[capacity];
this.incCapacity = incCapacity;
}
public int push(T t){
data[size] = t;
size++;
return size-1;
}
public T pop(){
T t = peek();
size--;
return t;
}
public T peek(){
return data[size-1];
}
public int search(T t){
for (int i = 0; i <size ; i++) {
if (t.equals(data[i]))
return i;
}
return -1;
}
}
测试自己写的栈结构:
package com.it.data;
public class TestForStack {
public static void main(String[] args){
StackByArr stack = new StackByArr(10);
stack.push(0);
stack.push(1);
stack.push(2);
stack.push(3);
StringBuffer sb = new StringBuffer();
System.out.println(stack.getSize());
int size = stack.getSize();
for (int i = 0; i <size ; i++) {
sb.append(stack.pop());
}
System.out.println(sb);
System.out.println(stack.getSize());
}
}
运行结果为:
4
3210
0
测试成功,当然代码的健壮性还需要增强。