栈是计算机世界不可缺少的一种数据结构。
栈中元素 先入后出,才取压栈的方式存取。
这种数据结构特别简单,但是特别有用。比如 编辑器中的撤销操作的实现。
借助之前的封装的属于自己的泛型数组,咱们来封装一个属于自己的栈。
package com.demo6;
public class TArray<T> {
private T[] data;
private int size;
@SuppressWarnings("unchecked")
public TArray(int capacity) {
data = (T[]) new Object [capacity];
size = 0;
}
public TArray() {
this(10);
}
// 获取数组容量
public int getCapacity() {
return data.length;
}
// 获取数组中元素个数
public int getSize() {
return size;
}
// 判断数组是否为空
public boolean isEmpty() {
return size == 0;
}
// 在数组末尾追加元素
public void addLast(T e) {
add(size, e);
}
// 在数组开头添加元素
public void addFirst(T e) {
add(0, e);
}
// 在数组中间插入元素
public void add(int index, T e) {
if (size == data.length)
throw new IllegalArgumentException("add fail,array id full");
if (index < 0 || index > size)
throw new IllegalArgumentException("add fail, need index > 0 and index <=size");
for (int i = size - 1; i >= index; i--)
data[i + 1] = data[i];
data[index] = e;
size++;
}
// 根据引脚获取值
public T get(int index) {
if (index < 0 || index >= size)
throw new IllegalArgumentException("get fail , index < 0 or index >= size");
return data[index];
}
// 根据引脚设置值
public void set(int index, T e) {
if (index < 0 || index >= size)
throw new IllegalArgumentException("get fail , index < 0 or index >= size");
data[index] = e;
}
// 是否包含某个元素
public boolean contains(T e) {
for (int i = 0; i < size; i++) {
if(e.equals(data[i])){
return true;
}
}
return false;
}
//查找某个元素对应的位置
public int find(T e){
for(int i = 0 ; i < size ; i++){
if(e.equals(data[i])){
return i;
}
}
return -1;
}
//删除index对应的元素 返回删除的元素
public T remove(int index){
if(index < 0 || index >= size){
throw new IllegalArgumentException("reomve fail , illegal args");
}
T ret = data[index];
for(int i = index+1 ; i < size ; i++){
data[i-1] = data[i];
}
size--;
return ret;
}
//删除第一个元素
public T removeFirst(){
return remove(0);
}
//删除最后一个元素
public T removeLast(){
return remove(size-1);
}
//根据元素删除数组中对应的元素 并返回删除的值
public boolean removeElement(T e){
boolean flag = true;
int index = find(e);
try {
remove(index);
} catch (Exception e2) {
flag = false;
}
return flag;
}
public T getLast(){
return removeLast();
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(String.format("Array: size = %d , capacity = %d \n", size, data.length));
sb.append('[');
for (int i = 0; i < size; i++) {
sb.append(data[i]);
if (i != size - 1) {
sb.append(',');
}
}
sb.append(']');
return sb.toString();
}
public T getLastElement() {
return get(size-1);
}
}
定义栈接口
package com.demo6;
public interface Stack<T> {
void push(T t); //压栈
T pull(); // 出栈
T peek(); // 获取栈顶元素
int getSize(); // 获取栈中元素个数
boolean isEmpty(); //判空
}
实现一个数组栈
package com.demo6;
public class ArrayStack<T> implements Stack<T>{
private TArray<T> array;
public ArrayStack(TArray<T> array){
this.array = array;
}
@Override
public void push(T t) {
array.addLast(t);
}
@Override
public T pull() {
return array.getLast();
}
@Override
public T peek() {
return array.getLastElement();
}
@Override
public int getSize() {
return array.getSize();
}
@Override
public boolean isEmpty() {
return array.isEmpty();
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("arrayStack:[");
for(int i = 0 ; i < array.getSize() ; i++){
sb.append(array.get(i));
if(i != array.getSize()-1){
sb.append(",");
}
}
sb.append("] -- top");
return sb.toString();
}
}
测试代码
package com.demo6;
public class Demo {
public static void main(String[] args) {
ArrayStack<Integer> arrayStack = new ArrayStack<>(new TArray<>());
arrayStack.push(23);
arrayStack.push(35);
arrayStack.push(68);
arrayStack.push(100);
System.out.println(arrayStack);
System.out.println(arrayStack.pull());
System.out.println(arrayStack);
System.out.println(arrayStack.peek());
System.out.println(arrayStack);
System.out.println(arrayStack.isEmpty());
System.out.println(arrayStack.getSize());
}
}
输出结果
arrayStack:[23,35,68,100] -- top
100
arrayStack:[23,35,68] -- top
68
arrayStack:[23,35,68] -- top
false
3