1.1队列的定义
队列是一种特殊的线性表,他只允许在表的前端进行删除操作,在表的后端进行插入操作。
1.2队列的特征
(1)通常称插入的这一端为队尾,另一删除端为队头。
(2)当表中没有元素称为空队。
(3)队列是先进先出的线性表。
1.3顺序队列操作
顺序表模拟队列的缺点:数组的优点在于对于元素的随机访问效率最大,但是当需要在数组头部进行删除操作时,需要移动数组之后的元素,时间复杂度较大。
1.4链式队列操作
队列的链式存储结构称为链式队列,他是限制在表头进行删除操作、表尾进行插入操作的单链表。链队的操作实际上是单链表的操作,只不过出队在表头进行,入队在表尾进行。
1.5循环队列
1.5.1循环队列实现思路
考虑到顺序队列由于多次入队或多次出队造成存储空间不满却不能进行继续入队操作的“假溢出”现象。为了解决顺序队列因数组下标越界而引起的"溢出问题"。可是序列的首尾相连。区别于顺序队列,队列空出一个存储单元,队列最多存储maxsize-1个数据元素。队满判定条件为front=(rear+1)%maxsize。
1.6队列真题演练
1.6.1两个栈模拟队列
实现思路:
栈:先进后出;
队列:先进先出。
import java.util.Stack;
public class twoStackToQueue{
public static<T> void twoStackToQueue(T[] arr){
Stack<T> stack1 = new Stack<>();
Stack<T> stack2 = new Stack<>();
for(int i=0;i<arr.length;i++){
stack1.push(arr[i]);
}
while(!stack1.isEmpty()){
stack2.push(stack1.peek());
stack1.pop();
}
while(!stack2.isEmpty()){
System.out.println(stack2.peek()+" ");
stack2.pop();
}
}
public static void main(String[] args){
Integer[] arr= new Integer[]{1,2,3};
twoStackToQueue(arr);
}
}
1.6.2两个队列模拟栈
public class twoQueueToStack<T>{
public static<T> void twoQueueToStack<T>{
MyQueue<T> queue1=new MyQueue<>();
MyQueue<T> queue2=new MyQueue<>();
for(int i=0;i<arr.length-1;i++){
queue1.push(arr[i]);
}
int srcLength=arr.length;
while(srcLength>0){
while(queue.size()>1){
queue2.push(queue1.peek());
queue1.pop();
}
System.out.println(queue1.peek()+" ");
srcLength--;
queue1.pop();
if(srcLength!=0){
while(queue2.size()>1){
queue1.push(queue2.peek());
queue2.pop();
}
System.out.print(queue2.peek()+" ");
queue2.pop();
srcLengyh--;
}
}
public static void main(String[] args){
Integer[] arr=new Integer[]{1,2,3};
twoQueueTostack(arr);
}
}
public class MyQueue<T>{
private int element;
private int size;
private static final iny INITSIZE=10;
public MyQueue(){
element=(T[])new Object[INITSZIE];
}
public void push(T[] value){
if(size==element.length){
element=Arrays.copyOf(element,element.length*2);
}
element[size++]=value;
}
public int size(){
return size;
}
public void peek(){
if(size==0){
throw new EmptyStackExceptio();
}
return element[0];
}
public void pop(){
if(size==0){
return ;
}
for(int i=0;i<size;i++){
element[i-1]=element[i];
}
element[size-1]=null;
size--;
}
}
}