顺序队列

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

 

 

 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));
}
}

posted @ 2022-04-25 16:12  近甜奶丸  阅读(48)  评论(0)    收藏  举报