题目:用数组结构实现大小固定的队列和栈
分析:如果强行限制给出一个长度为n的数组,设计一个大小为n的栈,如果超过这个大小,可以报错。
栈:先进后出
队列:先进先出
public class Array_To_Stack_Queue {
public static class ArrayStack {
private Integer[] arr;
private Integer size;
public ArrayStack(int initSize) { //因为题目是固定数组实现栈,所以initsize是要事先给出的,才知道空间要开多大
if (initSize < 0) {
throw new IllegalArgumentException("The init size is less than 0");
}
arr = new Integer[initSize];
size = 0;
}
public Integer peek() {
if (size == 0) {
return null;
}
return arr[size - 1];
}
public void push(int obj) {
if (size == arr.length) {
throw new ArrayIndexOutOfBoundsException("The queue is full");
}
arr[size++] = obj; //新来的数赋给size,然后size++
}
public Integer pop() {
if (size == 0) {
throw new ArrayIndexOutOfBoundsException("The queue is empty");
}
return arr[--size]; //返回size-1处的值,然后size--
}
}
public static class ArrayQueue {
private Integer[] arr;
private Integer size;//如果size变量没有到数组的长度,就把新的数放到last位置;如果size!=0,就把first位置的数拿给用户。所以first和last之间是解耦的,last和size之间有约束关系,first和size之间也有约束关系
private Integer first;//first变量指的是如果要拿取一个数,要拿哪个位置上的数
private Integer last;//last变量的含义是如果新加一个数,应该把它填到哪个位置上
public ArrayQueue(int initSize) {
if (initSize < 0) {
throw new IllegalArgumentException("The init size is less than 0");
}
arr = new Integer[initSize];
size = 0;
first = 0;
last = 0;
}
public Integer peek() {
if (size == 0) {
return null;
}
return arr[first];
}
public void push(int obj) {
if (size == arr.length) {
throw new ArrayIndexOutOfBoundsException("The queue is full");
}
size++;
arr[last] = obj;//新加的数放到last所指的位置
last = last == arr.length - 1 ? 0 : last + 1; //end如果已经来到最后一个位置了,跳回到0;如果没有到底,就往下走一个位置
}
public Integer poll() {
if (size == 0) {
throw new ArrayIndexOutOfBoundsException("The queue is empty");
}
size--;
int tmp = first;
first = first == arr.length - 1 ? 0 : first + 1; //first如果已经来到最后一个位置,就回到0;否则start往下走一个
return arr[tmp];
}
}
public static void main(String[] args) {
}
}