顺序队列
队列
先进先出 只能在一端进 另一端出 不允许在中间查找、取值、插入、删除 ->单向线程
要分配存储空间

a1出队 front位置元素变为a2即front依次后移 rear也依次后移 直到超过数组的最大下标 称为假溢出

解决方法:rear转向前面下表为0的位置
思路:数组是从0开始的 rear+1=Maxsize刚好越界 所以要转向前面下标为0的位置

变为循环队列

问题:队空时 front = rear
此时队满也是front =rear
无法判断到底front =rear 时是队空还是队满
解决方法:浪费一个空间 当队尾rear的下一个位置front 时就认为是队满
package queue
/*顺序队列*/
public class A{
private static final int Maxsize=100;
static class SqQueue{
int base[];
int front,rear;
}
static boolean initQueue(SqQueue q){
//初始化
q.base = new int[Maxsize];
//鲁棒 判断函数压力测试条件
if(q.base==null){
return false;
}
q.front = q.rear =0;
return true;
}
static boolean enQueue(SqQueue q, int e){
//将e元素压到队尾
if( (q.rear+1)%Maxsize==q.front ){
return false;//是否队满
}
q.base[q.rear++]=e;
return true;
}
static int deQueue(SqQueue q){
//从队头进行删除 返回要删除的元素的值
if (q.front ==q.rear ){
//是否是空队列 顺序队列
return -1;
}
int e =q.base[q.front ++];
return e;
}
static int getHead(SqQueue q){
if(q.front!=q.rear ){//顺序队列有值
return q.base[q.front ];
}
return -1;
}
static int queueLength(SqQueue q){
//实际元素个数
return(q.rear-q.front +Maxsize)%Maxsize;
}
public static void main(String[] args){
SqQueue q = new SqQueue ();
initQueue(q);
System.out.println(“请输入元素个数n”);
Scanner scanner = new Scanner(System.in);
int n = scanner .nextInt();
int x;
System.out.println(“请输入各个元素”);
while(n-- >0){
x=scanner.nextInt();
enQueue(q,x);
}
System.out.println (“长度:”+queueLength(q));
System.out.println (“队列的头元素:”+getHead(q));
System.out.println (“元素依次出队”);
while(true){
x=deQueue(q);
if(x!=-1){
System.out.println(x+”\t”);
}else {break;}
}
System.out.println (“长度”+queueLength(q));
}
}
浙公网安备 33010602011771号