堆栈是一种线性结构,也是一种特殊的线性表。它只在一端进行插入(入栈)或者删除(出栈),这一端称为栈顶,遵循后入先出的原则。
可以使用一个数组和一个记录栈顶位置的变量来实现栈的顺序存储结构。具体代码实现如下:
public class Mystack {
private int top;
private int maxSize;
private Object[] arr;
//无参构造
//带参构造
//setter
//getter
public void Push(Object vaule) {
if(top == maxSize - 1) {
System.out.println("该栈已经满了"); //如果top=栈的最大长度,则说明栈中空间已经放满了
}else {
arr[++top] = vaule; //栈中还有足够的空间,将栈顶位置+1,放入压栈元素
System.out.println("压栈元素为" + arr[top]);
}
}
public void Pop() {
if(top == -1) {
System.out.println("这是一个空栈"); //如果top=-1,则说明栈中没有元素
}else {
Object vaule = arr[top];
arr[top--] = null; // 取出栈顶元素,栈顶位置-1,原栈顶为null
System.out.println("出栈元素为" + vaule);
}
}
}
//main测试
public static void main(String[] args) {
Object[] a = new Object[8]; //创建一个数组
String[] arr1 = {"1", "2", "3", "4", "5"}; //待压栈的数组
int maxSize = a.length;
System.out.println("栈的长度是" + maxSize);
Mystack mystack = new Mystack(-1, maxSize, a); //创建一个栈对象
for (int i = 0; i < arr1.length; i++) {
mystack.Push(arr1[i]); //压栈
}
System.out.println("--------------");
for (int i = 0; i < 2; i++) {
mystack.Pop(); //出栈
}
for (int i = 0; i < a.length; i++) {
System.out.println("----------");
System.out.println(a[i]); //观察栈里的情况
}
}
输出结果为:
栈的长度是8
压栈元素为1
压栈元素为2
压栈元素为3
压栈元素为4
压栈元素为5
--
出栈元素为5
出栈元素为4
--
1
2
3
null
null
null
null
null
如何用一个数组实现两个堆栈,要求最大程度利用数组空间
要完成上述要求,那么我们在有元素入栈时,只要栈中有空间,就需要进行入栈操作。这样的话,无非两种方法,一种是将数组从中间开辟成两个栈,中间位置便是栈底,向两边进行入栈。
对于这种方法,存在一个弊端,如果其中一个堆栈满了,而另外一个堆栈有空余空间,这样就会造成空间的浪费。
为了解决这个问题,我们可以把数组的两端作为两个栈底,有元素入栈时,一同朝中间入栈。这样只要数组有空余空间,那么就可以进行入栈操作。
具体代码实现如下:
public class Mystack {
private int top1;
private int top2;
private int maxSize;
private Object[] arr;
//无参构造
//带参构造
//setter
//getter
public void Push(Object vaule, int flag) {
if (top2 - top1 == 1) {
System.out.println("该栈已经满了"); //栈1是空栈时,其栈顶位置为-1;栈2是空栈时,其栈顶位置为栈最大长度;如果两个栈顶位置差为1,则说明栈中空间已满
} else {
if (flag == 1) {
arr[++top1] = vaule; //对栈1操作
System.out.println("压栈元素为" + arr[top1]); //栈中还有足够的空间,将栈顶位置+1,放入压栈元素
} else {
arr[--top2] = vaule; //对栈2操作
System.out.println("压栈元素为" + arr[top2]); //栈中还有足够的空间,将栈顶位置-1,放入压栈元素
}
}
}
public void Pop(int flag) {
if (flag == 1) { //对栈1操作
if (top1 == -1) {
System.out.println("这是一个空栈"); //对栈1,如果top1=-1,则说明栈中没有元素
} else {
Object vaule = arr[top1];
arr[top1--] = null; // 取出栈顶元素,栈顶位置-1,原栈顶为null
System.out.println("出栈元素为" + vaule);
}
} else { //对栈2操作
if (top2 == maxSize) {
System.out.println("这是一个空栈"); //对栈2,如果top2=栈最大长度,则说明栈中没有元素
} else {
Object vaule = arr[top2];
arr[top2++] = null; // 取出栈顶元素,栈顶位置+1,原栈顶为null
System.out.println("出栈元素为" + vaule);
}
}
}
}
//main测试
public static void main(String[] args) {
int flag1 = 1;
int flag2 = 1;
Object[] arr1 = new Object[4];
String[] arr2 = {"1", "2", "3", "4", "5"}; //待压栈的数组
int maxSize = arr1.length;
Mystack mystack = new Mystack(-1, maxSize, maxSize, arr1);
for (int i = 0; i < arr2.length; i++) {
if (flag1 == 3) {
flag1 = 1; //切换堆栈
}
mystack.Push(arr2[i], flag1);
flag1 += 1;
}
System.out.println("------------");
for (int i = 0; i < arr2.length; i++) {
if (flag2 == 3) {
flag2 = 1;
}
mystack.Pop(flag2);
flag2 += 1;
}
System.out.println("------------");
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i]);
}
}
输出结果为:
压栈元素为1
压栈元素为2
压栈元素为3
压栈元素为4
压栈元素为5
--
出栈元素为5
出栈元素为4
--
1
3
null
null
null
null
null
2