栈和队列这两个数据结构底层都是基于数组来实现的:
Java API提供了Queue、Deque接口,由LinkedList来实现着两种数据结构,通过offer()、poll()等方法来操作队列Queue;通过push()、pop()等方法来实现栈Deque。
System.out.println("************使用API实现队列**************");
//使用API提供的Queue接口来实现队列
Queue<Integer> queue=new LinkedList();
queue.offer(1);
queue.offer(2);
queue.offer(3);
System.out.println(queue.isEmpty());
System.out.println(queue.poll());
System.out.println(queue.poll());
System.out.println(queue.poll());
System.out.println(queue.isEmpty());
System.out.println("************使用API实现栈**************");
//使用API提供的Queue接口来实现队列
Deque<Integer> deque=new LinkedList();
deque.push(1);
deque.push(2);
deque.push(3);
System.out.println(deque.isEmpty());
System.out.println(deque.poll());
System.out.println(deque.poll());
System.out.println(deque.poll());
System.out.println(deque.isEmpty());
基于数组的实现:
public class NewQueue<E>{//队列实现
private E[] queue;
public NewQueue(){
queue=(E[])new Object[0];
}
//队列元素的添加
public void offer(E element){
//创建新数组代替原数组,动态扩容
E[] newArr=(E[])new Object[queue.length+1];
//将原来的数组复制到新数组中
for(int i=0;i<queue.length;i++){
newArr[i]=queue[i];
}
//数据添加进队列
newArr[queue.length]=element;
//更新数组
queue=newArr;
}
//弹出队列头元素
public E poll(){
//判断是否空队列,若空队列则抛出异常
if(isEmpty()){
throw new RuntimeException("Queue is empty");
}
//弹出队列顶元素
E pollEle=queue[0];
//更新队列内容信息
E[] newArr= (E[]) new Object[queue.length-1];
for(int i=0;i<newArr.length;i++){
newArr[i]=queue[i+1];
}
//更新数组
queue=newArr;
return pollEle;
}
public boolean isEmpty(){
//判断队列是否为空
return queue.length==0;
}
}
public class NewDeque<E>{//栈实现
private E[] deque;
public NewDeque(){
deque=(E[])new Object[0];
}
//压栈
public void push(E element){
//创建新数组代替原数组,动态扩容
E[] newArr=(E[])new Object[deque.length+1];
//将原来的数组复制到新数组中
for(int i=0;i<deque.length;i++){
newArr[i]=deque[i];
}
//压栈
newArr[deque.length]=element;
//更新数组
deque=newArr;
}
//弹出栈顶元素
public E pop(){
//判断栈是否为空
if(isEmpty()){
throw new RuntimeException("Deque is empty");
}
//弹出栈顶元素
E popEle=deque[deque.length-1];
//更新栈内容信息
E[] newArr= (E[]) new Object[deque.length-1];
for(int i=0;i<newArr.length;i++){
newArr[i]=deque[i];
}
//更新数组
deque=newArr;
return popEle;
}
public boolean isEmpty(){
//判断队列是否为空
return deque.length==0;
}
}