如果我们有两个相同类型的栈,我们它们各自开辟了数组空间,极有可能第一个栈已经满了,再进栈就溢出了,而另一个栈还有很多存储空间空闲,我们完全可以用一个数组来存储两个栈。————引自大话数据结构第四章4.5 两栈共享空间
package com.myTest.stack;
/**
* java实现两栈共享存储空间
*
*/
public class SharedStack<T> implements java.io.Serializable {
public static void main(String[] args) {
SharedStack<Integer> sharedStack = new SharedStack<>(5);
sharedStack.push(1,1);
sharedStack.push(2,2);
System.out.println(sharedStack);
}
private static Object[] elements = {};
// 栈1栈顶指针
private static int top1;
//栈2栈顶指针
private static int top2;
//初始化数组大小
private static int initialCapacity=10;
private SharedStack() {
}
//初始化栈
public SharedStack(int size) {
elements = new Object[size];
initialCapacity = size;
top1 = -1; //-1时栈1为空
top2 = size; //栈2等于数组的大小时,栈2为空
}
/**
* 压栈
*
* @param obj 对象
*/
public synchronized void push(T obj, int stackNum) {
if (top1 + 1 == top2) throw new RuntimeException("栈空间溢出");
else if (stackNum == 1) {
elements[++top1] = obj;
} else if (stackNum == 2) {
elements[--top2] = obj;
} else throw new RuntimeException("栈号参数超出范围");
}
/**
* 弹栈
* @param stackNum 栈标号
* @return T
*/
public synchronized T pop(int stackNum) {
if (stackNum == 1) {
if (top1 <= -1) throw new RuntimeException("栈1角标越界");
int i = top1--;
T element = (T) elements[i];
elements[i] = null;
return element;
} else if (stackNum == 2) {
if (top2 >= initialCapacity) throw new RuntimeException("栈2角标越界");
int j = top2++;
T element = (T) elements[j];
elements[j] = null;
return element;
} else {
return null;
}
}
/**
* 获取栈空间大小
* @param stackNum 栈标号
*/
public int size(int stackNum) {
int size=0;
if(stackNum==1){
size=top1+1;
}else{
size=initialCapacity-top2;
}
return size;
}
@Override
public String toString() {
String result = "[";
for (Object obj : elements) {
result = result + obj + ",";
}
int i = result.lastIndexOf(",");
result = result.substring(0, i);
result = result + "]";
return result;
}
}