タグ: Java
数据结构
算法
著者:Maxchen
バージョン:V1.0.0
日付:2020年4月1日
1.循環キュー - コンセプト
パートIは、「Javaのデータ構造とアルゴリズム02 -キューは、」我々は、配列、キューの順番チーム操作はデータ移行、データの移行を必要とし、コストが比較的大きいたびに、各データ移行の実現のために基づいてキューについて話しました時間計算量はO(n)が、これは大幅キューのパフォーマンスに影響します。移動するには、我々はチームであれば、チームのヘッドバック、我々は毎回データ移行チームを避けるために持っているので、我々は唯一の頭と尾を必要とする配列のサイズに等しい0に等しくない場合、データの移行に一度、チームは、チームへの継続的な使用のためのスペースを残しています。図は、データ移行プロセスである1
円形のキューは、キューの改良であるため、キュー不可避データ移行、データ移行性能が損なわれる可能性がキュー、テールが最大の配列インデックスに到達キューサイクルに変換この問題を回避するために再び従って、データマイグレーションを回避する、バック配列の添字0位置を指します。チームは循環キュー、エンキュー操作で見てみましょう:
2.循環キュー - のためのコード
私たちは、以下のフローチャートの全体的な動作のために基づいてキュー変換を循環キューの原則に従ってください
ステップ:円形キュー満杯状態(rear+1)%n== front
、循環キュー空の状態rear == front
、n型アレイは、元の完全な空判別コードを決定するキューの最大容量を表します。
変更
//判断队列是否满
public boolean isFull(){
return (rear + 1) % maxSize == front;
}
//判断是否为空
public boolean isEmpty(){
return rear == front;
}
ステップ2:キューの最初の要素を指すようにフロントが必要、元のコード
変更
//添加队列数据,入队列
public void addQueue(int n){
……
rear++;
arr[rear] = n;
}
//获取队列数据,出队列
public int getQueue(){
……
//这里需要分析出 front 是指向队列的第一个元素
//1、先把front对应的值保留到一个临时变量
//2、将front后移,考虑取模
//3、将临时保存的变量返回
int value = arr[front];
front = (front + 1) % maxSize;
return value;
}
//显示队列的头数据
public int headQueue(){
……
//由于front始终指向第一个元素,队列的头数据直接从front中获取
return arr[front];
}
第三段階:コード・キューの表示を変更します
// 求出当前队列有效数据个数
public int size(){
return (rear + maxSize - front) % maxSize;
}
//显示队列所有数据
public void showQueue(){
//遍历
if(isEmpty()){
System.out.println("队列空,无数据");
return;
}
for (int i=front; i< front + size(); i++){
System.out.printf("arr[%d]=%d\n", i % maxSize, arr[i % maxSize]);
}
}
3.円形のキューを - テスト
最初のステップは:a
あなたがキューに追加されるまでキューデータを追加いっぱいで、クリックしs
、現在の循環キューを確認します
ステップ2:g
GETデータキューは、クリックしs
、現在の循環キューを表示し、クリックしてh
表示最初のデータキューを
第三段階:もう一度クリックしa
、データキューを追加するには、キューのデータを、我々は最初の要素の最後に追加されたバックを見つけますarr[0]
4.循環キュー - 全体的なコード
このような環境の下に接続されているすべてのコード・キュー
package com.maxchen.demo.sparsearray;
import java.util.Scanner;
/**
* @ClassName: CircleArrayDemo
* @Description: TODO
* @Author Maxchen
* @Date 2020/4/1 14:13
* @Version V1.0.0
*
*/
public class CircleArrayDemo {
public static void main(String[] args) {
//创建队列
//设置4表示队列的有效数据最大是3
CircleArray circleArray = new CircleArray(4);
//接收用户输入
char key = ' ';
Scanner scanner = new Scanner(System.in);
boolean loop = true;
//输出菜单
while (loop){
System.out.println("s(show)");
System.out.println("e(exit)");
System.out.println("a(add)");
System.out.println("g(get)");
System.out.println("h(head)");
key = scanner.next().charAt(0);
switch (key){
case 's':
circleArray.showQueue();
break;
case 'a':
System.out.println("添加队列数据");
int value = scanner.nextInt();
circleArray.addQueue(value);
break;
case 'g':
try {
int res = circleArray.getQueue();
System.out.printf("获取队列数据:%d\n",res);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case 'h':
try {
int res = circleArray.headQueue();
System.out.printf("队列头的数据:%d\n", res);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case 'e':
scanner.close();
loop = false;
break;
default:
break;
}
}
System.out.println("程序结束");
}
}
class CircleArray{
//数组最大容量
private int maxSize;
//front 指向队列的第一个元素,第一个元素的队列用arr[front]表示
//front初始值0
private int front;
//rear 指向队列的最后一个元素,空出一个空间作为约定
//rear初始值0
private int rear;
//存放数据并模拟队列
private int[] arr;
public CircleArray(int arrMaxSize){
maxSize = arrMaxSize;
arr = new int[maxSize];
}
//判断队列是否满
public boolean isFull(){
return (rear + 1) % maxSize == front;
}
//判断是否为空
public boolean isEmpty(){
return rear == front;
}
//添加队列数据,入队列
public void addQueue(int n){
//判断队列是否满,满了无法添加队列
if (isFull()){
System.out.println("队列满了无法添加队列");
return;
}
arr[rear] = n;
rear = (rear + 1) % maxSize;
}
//获取队列数据,出队列
public int getQueue(){
//队列空,不能取数据
if(isEmpty()){
throw new RuntimeException("队列空,不能取数据");
}
//这里需要分析出 front 是指向队列的第一个元素
//1、先把front对应的值保留到一个临时变量
//2、将front后移,考虑取模
//3、将临时保存的变量返回
int value = arr[front];
front = (front + 1) % maxSize;
return value;
}
// 求出当前队列有效数据个数
public int size(){
return (rear + maxSize - front) % maxSize;
}
//显示队列所有数据
public void showQueue(){
//遍历
if(isEmpty()){
System.out.println("队列空,无数据");
return;
}
for (int i=front; i< front + size(); i++){
System.out.printf("arr[%d]=%d\n", i % maxSize, arr[i % maxSize]);
}
}
//显示队列的头数据
public int headQueue(){
//判断
if(isEmpty()){
throw new RuntimeException("队列空的,没有数据");
}
return arr[front];
}
}