Java基础の行列シミュレーションサイクル行列
一、行列案内
キューは順序リストです。「先入先出」という原則に従い、先に列に入れたデータを先に取り出し、後に入れたデータを取り出します。
キューには2つの格納表現があり、順序表示とチェーン表示があります。順序表現は行列で実現できます。
二、行列シミュレーション行列
配列で列をシミュレートする場合、2つの値front=0、rear=0を設定します。frontはキューヘッダの最初のデータ位置を表し、rearは最後のデータの次の位置を表します。
配列列にデータを挿入すると、尻尾から挿入されます。つまり、array[rear]=valueです。同時にrear後にシフトします。rear++です。データを取り出す時、頭からデータを取り出し、value=array[front]を同時にfront後にfront++を移動します。
front=0の時、rear=maxSize(配列の最大長さ)は、列がいっぱいになって、データを再び入れることができません。
この時にチーム操作を実行すれば、また格納可能な空間がありますが、データを挿入し続けると、オーバーフローが発生します。つまり、配列が境界を越えてプログラムが不正に操作されたということです。実際の空間は満杯ではないので、この現象を「偽オーバーフロー」と呼ぶ。これは「チームの最後に入隊し、チームの先頭に出る」という制限操作によるものです。
「偽オーバーフロー」の問題はどう解決しますか?
答えは循環行列です。
三、行列シミュレーション循環行列
順番待ち行列を環状空間に変えます。front、rearとキュー要素の関係は変わりません。ただ、巡回キューの中で、front、rearは順番に後に1を移動する操作は「モード」演算で実現できます。
型を取ることによって、front、rearは順序表空間内で頭と尾をつなぐ方式で「循環」して移動することができます。
元素がチームから出た後、front=(front+1)%maxSize;
元素が入隊したら、rear=(rear+1)%maxSizeです。
(maxSizeは行列の最大長さです。)
例えば、列の最大長さは4で、rear=3の時にデータを預け入れて、array[3]=value、rearの後に1位移動して、もし型を取って演算していないならば、rear=4、この時引き続きデータを挿入して、array[4]は境界を越えます。
型取り演算をすれば、rear=(rear+1)%maxSize、このときrear=0、rearは再び0の位置に戻ります。このような演算は、rearの値が0、1、2、3の間で循環するようにする。
frontの値は同じです。
こんなに多くの字を書いたなら、コードを見たほうが分かりやすいと思います。
四、コード実現
配列シミュレーション
この記事ではJava基础の行列シミュレーションサイクル行列について紹介します。Java配列に関するものがもっと多いです。私たちの以前の文章を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。
キューは順序リストです。「先入先出」という原則に従い、先に列に入れたデータを先に取り出し、後に入れたデータを取り出します。
キューには2つの格納表現があり、順序表示とチェーン表示があります。順序表現は行列で実現できます。
二、行列シミュレーション行列
配列で列をシミュレートする場合、2つの値front=0、rear=0を設定します。frontはキューヘッダの最初のデータ位置を表し、rearは最後のデータの次の位置を表します。
配列列にデータを挿入すると、尻尾から挿入されます。つまり、array[rear]=valueです。同時にrear後にシフトします。rear++です。データを取り出す時、頭からデータを取り出し、value=array[front]を同時にfront後にfront++を移動します。
front=0の時、rear=maxSize(配列の最大長さ)は、列がいっぱいになって、データを再び入れることができません。
この時にチーム操作を実行すれば、また格納可能な空間がありますが、データを挿入し続けると、オーバーフローが発生します。つまり、配列が境界を越えてプログラムが不正に操作されたということです。実際の空間は満杯ではないので、この現象を「偽オーバーフロー」と呼ぶ。これは「チームの最後に入隊し、チームの先頭に出る」という制限操作によるものです。
「偽オーバーフロー」の問題はどう解決しますか?
答えは循環行列です。
三、行列シミュレーション循環行列
順番待ち行列を環状空間に変えます。front、rearとキュー要素の関係は変わりません。ただ、巡回キューの中で、front、rearは順番に後に1を移動する操作は「モード」演算で実現できます。
型を取ることによって、front、rearは順序表空間内で頭と尾をつなぐ方式で「循環」して移動することができます。
元素がチームから出た後、front=(front+1)%maxSize;
元素が入隊したら、rear=(rear+1)%maxSizeです。
(maxSizeは行列の最大長さです。)
例えば、列の最大長さは4で、rear=3の時にデータを預け入れて、array[3]=value、rearの後に1位移動して、もし型を取って演算していないならば、rear=4、この時引き続きデータを挿入して、array[4]は境界を越えます。
型取り演算をすれば、rear=(rear+1)%maxSize、このときrear=0、rearは再び0の位置に戻ります。このような演算は、rearの値が0、1、2、3の間で循環するようにする。
frontの値は同じです。
こんなに多くの字を書いたなら、コードを見たほうが分かりやすいと思います。
四、コード実現
配列シミュレーション
package com.ArrayQueue;
import java.util.Scanner;
public class CircleArrayQueueDemo {
public static void main(String args[]){
int maxSize = 4;
CircleArrayQueue queue = new CircleArrayQueue(maxSize);
Scanner scanner = new Scanner(System.in);
char key;
boolean loop = true;
while (loop) {
// ,
System.out.println("a(add): ");
System.out.println("g(get): ");
System.out.println("h(head): ");
System.out.println("s(show): ");
System.out.println("q(quit): ");
// , maxSize-1
System.out.printf("( :%d)
",maxSize-1);
key = scanner.next().charAt(0);//
try {
switch (key) {
case 'a':
System.out.println(" :");
int value = scanner.nextInt();
queue.addQueue(value);
System.out.println(" 。");
break;
case 'g':
System.out.printf(" :%d
", queue.getQueue());
break;
case 'h':
queue.headQueue();
break;
case 's':
queue.showQueue();
break;
case 'q':
scanner.close();
loop = false;
System.out.println(" 。");
break;
default:
break;
}
} catch (RuntimeException e) {
System.out.println(e.getMessage());
}
}
}
}
/**
*
*
*/
class CircleArrayQueue{
private int maxSize;
private int front;//
private int rear;//
private int arr[];//
// ,
public CircleArrayQueue(int size){
maxSize = size;
front = 0;
rear = 0;
// maxSize, maxSize-1
arr = new int[maxSize];
}
// :front == rear
public boolean isEmpty(){
return front == rear;
}
// :(rear+1)%maxSize == front
public boolean isFull(){
return (rear+1)%maxSize == front;
}
// ,
public void addQueue(int n){
//
checkFull();
arr[rear] = n;
rear = (rear+1)%maxSize;
}
// ,
public int getQueue(){
//
checkEmpty();
int value = arr[front];
front = (front+1)%maxSize;
return value;
}
//
public int size(){
return (rear-front+maxSize)%maxSize;
}
//
public void showQueue(){
//
checkEmpty();
for(int i=front;i<front+size();i++){
System.out.printf("arr[%d]=%d
",i%maxSize,arr[i%maxSize]);
}
System.out.printf(" front=%d,rear=%d
",front,rear);
}
// , front
public void headQueue(){
//
checkEmpty();
System.out.printf(" :%d
",arr[front]);
}
// , front,rear ,
public void checkEmpty(){
if (isEmpty()) {
System.out.printf(" front=%d,rear=%d
",front,rear);
throw new RuntimeException(" , ");
}
}
// , front,rear ,
public void checkFull(){
if(isFull()){
System.out.printf(" front=%d,rear=%d
",front,rear);
throw new RuntimeException(" , ");
}
}
}
五、運転結果この記事ではJava基础の行列シミュレーションサイクル行列について紹介します。Java配列に関するものがもっと多いです。私たちの以前の文章を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。