線性結構:最常用的資料結構,特點是資料元素之間存在一對一的線性關係
** 分倆種儲存結構 **
1.順序儲存結構:又稱為順序表,儲存元素是連續的 **
2.鏈式儲存結構:又稱為鍊錶,儲存元素不一定是連續的,元素節點中存放資料元素以及相鄰元素的位址結構
常見線性資料結構:陣列、佇列、鍊錶、棧
非線性結構:常見二維陣列、多維陣列、廣義表、樹、圖
使用場景:如果乙個陣列很多元素的值都相同時,使用稀疏陣列來儲存該陣列,縮小儲存規模,提高效率
以二維陣列轉化的稀疏陣列為例:第一行為二維陣列的總行數、總列數和不為0的數,第二行開始記錄每個不為0的
數的具體位置,第一列為行的位置,第二列為列的位置,第三列為具體的值
示例:需求:五子棋盤對映為乙個二維陣列,將此二維陣列儲存到乙個稀疏陣列內,存入磁碟並讀取再轉化為二維陣列
** **實現
public
class
sparsetest}}
//定義對應稀疏陣列,將二維陣列不為0的資料存入
int[
] sparsearr=
newint
[sum+1]
[3];
sparsearr[0]
[0]=arr.length;
sparsearr[0]
[1]=arr[0]
.length;
sparsearr[0]
[2]=sum;
int count=0;
// 記錄第i個非0數
for(
int i =
0; i < arr.length; i++)}
}//將稀疏陣列寫入磁碟,採用物件序列化的方式
file file=
newfile
("d:\\1.txt");
objectoutputstream out=
newobjectoutputstream
(new
fileoutputstream
(file));
out.
writeobject
(sparsearr)
; out.
close()
;//從磁碟將稀疏陣列反序列化
objectinputstream in=
newobjectinputstream
(new
fileinputstream
(file));
int[
] newsparsearr =
(int
) in.
readobject()
;//將新的稀疏陣列轉化為二維陣列並驗證結果
int[
] newarr=
newint
[newsparsearr[0]
[0]]
[newsparsearr[0]
[1]]
;for
(int i =
1; i < sparsearr.length; i++
) system.out.
println
(arrays.
deeptostring
(newarr));
}}
一種有序列表,可以用陣列和鍊錶來實現,特點:先存入的先取出,後存入的後取出
** 示例(陣列模擬環形佇列)
package myqueue;
//陣列模擬環形佇列
@suppresswarnings
("all"
)public
class
roundqueue
//判斷佇列是否已滿
public
boolean
isfull()
//判斷佇列是否為空
public
boolean
isempty()
//向佇列新增資料
public
void
addroundqueue
(int data)
arr[rear]
=data;
rear=
(rear+1)
%maxsize;
system.out.
println
("新增了 "
+data);}
//從佇列取出資料
public
void
getroundqueue()
int data=arr[front]
; front=
(front+1)
%maxsize;
system.out.
println
("取出得資料為 "
+data);}
//顯示佇列全部資料
public
void
showroundqueue()
//迴圈展示佇列資料,從頭位置迴圈到尾部位置
// 因為是環形佇列,所以獲取下標時需要通過取模進行限制,底層是陣列,防止下標越界
// 並且在尾部後乙個位置已經到佇列尾部的時候,如果陣列前面有位置可以存,取模可以將空位移到
//開始位置
for(
int i = front; i (rear-front+maxsize)
%maxsize ; i++)}
//顯示佇列頭部資料
public
void
peep()
system.out.
println
(arr[front]);
}}** 測試
public
class
queuetest
catch
(exception e)
break
;case
"h":
trycatch
(exception e)
break
;case
"a":
system.out.
println
("請輸入新增資料");
arrayqueue.
addqueue
(scanner.
nextint()
);break
;case
"g":
trycatch
(exception e)
break
;case
"e":
flag=
false
;break
;default
:break;}
}}}*
* 無法迴圈重複利用的佇列實現(測試同上)
package myqueue;
//陣列模擬佇列
public
class
arrayqueue
//判斷佇列是否為空
public
boolean
isempty()
//判斷佇列是否已滿
public
boolean
isfull()
//向佇列內新增資料
public
void
addqueue
(int dada)
rear++
; arrqueue[rear]
=dada;
system.out.
println
("存入佇列資料為 "
+dada);}
//從佇列內取出資料
public
void
getqueue()
front++
; system.out.
println
("取出的資料為 "
+arrqueue[front]);
}//檢視佇列全部資料
public
void
showqueue()
for(
int i : arrqueue)
}//檢視佇列頭部資料
public
void
peep()
system.out.
println
("佇列頭資料為 "
+arrqueue[front+1]
);}}
資料結構演算法爬坑日記六
回溯法 也叫向前試探法,試著尋找正確的求解,當探索到某一步不符合規則時,便回退到上一步進行重新選擇,直到獲取預期的解法 問題描述 在8 8的西洋棋棋盤上,放置八個皇后且八個皇后不能互相攻擊 思路 先將第乙個放在第一行第一列,然後將第二個放在第二行第一列,檢查是否滿足規則,如果滿足則進入第三個的放 置...
資料結構演算法爬坑日記八
思想 通過一次排序將一組資料分為兩部分,一部分全部比另一部分小,然後對兩部分分別再進行快排,迴圈此操作,直到不能再分割,便得到乙個有序序列 實現 快速排序 public class quicksort sort arr,0,arr.length 1 system.out.println arrays...
資料結構演算法爬坑日記十
雜湊表 也叫雜湊表,通過將關鍵碼值對映到表中的乙個位置來訪問,加快查詢的速度,對映函式也叫雜湊函式,存放記錄的陣列叫雜湊表,在對一些不常改變的資料進行操作的時候,為了加快速度,通常會採用快取技術將其載入 到記憶體中進行操作,而不直接對資料庫進行操作,如redis,雜湊表就相當於乙個簡化版redis,...