目次
リニアテーブル
同じ特性を持つデータ要素の有限シーケンスは線形リストと呼ばれ、配列も線形リストの一種です。
一般的な線形テーブルには、シーケンシャル リスト、リンク リスト、スタック、キューなどがあります。
線形テーブルは論理的には直線、つまり線形構造と考えることができますが、線形テーブルを使用する場合、必ずしも直線上にあるとは限りません。つまり、線形テーブルの物理構造は必ずしも直線上にあるわけではありません。継続的な。
線形構造には、シーケンシャル ストレージとチェーン ストレージという 2 つの保存方法があります。通常、配列およびチェーン構造の形式で保存されます。
順次ストレージ:
論理的には連続する直線であり、物理的にも連続する直線です。
チェーンストレージ:
論理的には直線ですが、物理構造は連続的に保存されません。
シーケンステーブル
シーケンステーブルは線形テーブルの一種で、アドレスが連続した空間を利用してデータを格納する線形構造です。
配列の定義に少し似ていますか? はい、シーケンス テーブルは配列を使用してデータの追加、削除、変更、チェックを行います。
シーケンステーブルのシミュレーション実装
class Onder{
public int[] elem; //数组 实现顺序表
public int useSize; //有效元素的个数
public static final int DEFAULT_UseSize = 5;
public onder() {
this.elem = new int[DEFAULT_UseSize];
}
}
Onder のパラメーターなしのコンストラクターを呼び出すと、システムは 5 つの int を格納できるデータ スペースを構築します。
つまり、シーケンス テーブルの基礎となる容量を DEFAULT_UseSize に設定します。
新しい要素
現在のシーケンス テーブルにはデータがないため、現時点ではシーケンス テーブルに要素を追加する必要があります。
シーケンス リストの最後に要素を追加します。
/**
* 判断顺序表是否已满
* @return
*/
public boolean IsFull() {
return this.elem.length == this.useSize;
}
/**
* 在顺序表的最后新增元素
* @param val
*/
public void add(int val) {
//先判断整个顺序表是否已满,如果已满,则需对顺序表进行扩容
if(IsFull()) {
this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
}
this.elem[useSize++] = val;
}
位置 pos に要素を追加します。
/**
* 检查pos位置是否合法
* @param pos
* @return
*/
public boolean index(int pos) {
return pos >= 0 && pos < this.useSize;
}
/**
* 在pos位置新增元素
* @param pos
* @param val
*/
public void add(int pos,int val) {
//先判断整个顺序表是否已满,如果已满,则需对顺序表进行扩容
if(IsFull()) {
this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
}
//再判断pos位置是否合法
if(index(pos)) {
for (int i = this.elem.length-1; i > pos; i--) {
this.elem[i] = this.elem[i-1];
}
this.elem[pos] = val;
this.useSize++;
} else {
System.out.println("pos位置不合法,请检查合法性");
}
}
要素の削除
最初に出現したキーワード キーを削除します
/**
* 删除第一次出现的关键字key
* @param key
*/
public void remove(int key) {
for (int i = 0; i < this.useSize-1; i++) {
if(this.elem[i] == key) {
for (int j = i; j < this.useSize-1; j++) {
this.elem[j] = this.elem[j+1];
}
this.useSize--;
this.elem[useSize] = 0; //最后一个元素置为0
return;
}
}
System.out.println("没有你要删除的关键字");
}
要素を変更します:
位置 pos の要素を val に変更します
/**
* 将pos位置的值改为val
* @param pos
* @param val
*/
public void set(int pos,int val) {
if(pos>=0 && pos< this.useSize) {
this.elem[pos] = val;
return;
}
System.out.println("pos位置不合法");
}
要素の検索:
要素に対応する位置を見つける
/**
* 查找某个元素对应的位置
* @param val
* @return
*/
public int indexOf(int val) {
for (int i = 0; i < this.useSize-1; i++) {
if(this.elem[i] == val) {
return i;
}
}
return -1;
}
位置 pos の要素を取得します
/**
* 获取pos位置的值
* @param pos
* @return
*/
public int get(int pos) {
if(pos>=0 && pos< this.useSize) {
return this.elem[pos];
}
return -1;
}
要素が含まれているかどうかを判断する
/**
* 判断是否包含某个元素的值
* @param val
* @return
*/
public boolean contains(int val) {
for (int i = 0; i < this.useSize-1; i++) {
if(this.elem[i] == val) {
return true;
}
}
return false;
}
シーケンステーブルの長さを取得する
/**
* 获取顺序表的长度
* @return
*/
public int size() {
return this.useSize;
}
シーケンステーブルをクリアする
/**
* 清空顺序表
*/
public void clear() {
this.useSize = 0; //如果顺序表中存放的是引用类型,则需要将每一个元素全部置为null
}