1.1稀疏數(shù)組和隊(duì)列

1稀疏數(shù)組

沒什么好說的,挺簡(jiǎn)單的械媒。就是講數(shù)組轉(zhuǎn)換為n行3列的二維數(shù)組目锭。



接下來是代碼



package com.atguigu.sparsearray;

public class SparseArray {

public static void main(String[] args) {

// 創(chuàng)建一個(gè)原始的二維數(shù)組 11 * 11

// 0: 表示沒有棋子, 1 表示 黑子 2 表藍(lán)子

int chessArr1[][] = new int[11][11];

chessArr1[1][2] = 1;

chessArr1[2][3] = 2;

chessArr1[4][5] = 2;

// 輸出原始的二維數(shù)組

System.out.println("原始的二維數(shù)組~~");

for (int[] row : chessArr1) {

for (int data : row) {

System.out.printf("%d\t", data);

}

System.out.println();

}



// 將二維數(shù)組 轉(zhuǎn) 稀疏數(shù)組的思

// 1. 先遍歷二維數(shù)組 得到非0數(shù)據(jù)的個(gè)數(shù)

int sum = 0;

for (int i = 0; i < 11; i++) {

for (int j = 0; j < 11; j++) {

if (chessArr1[i][j] != 0) {

sum++;//非0數(shù)據(jù)個(gè)數(shù)

}

}

}

// 2. 創(chuàng)建對(duì)應(yīng)的稀疏數(shù)組

int sparseArr[][] = new int[sum + 1][3];//m有多少個(gè)就有多少行

// 給稀疏數(shù)組賦值

sparseArr[0][0] = 11;

sparseArr[0][1] = 11;

sparseArr[0][2] = sum;

// 遍歷二維數(shù)組纷捞,將非0的值存放到 sparseArr中

int count = 0; //count 用于記錄是第幾個(gè)非0數(shù)據(jù)

for (int i = 0; i < 11; i++) {

? ? ? ? ? ? ? ?for (int j = 0; j < 11; j++) {

? ? ? ? ? ? ? if (chessArr1[i][j] != 0) {

? ? ? ? ? ? ? ? ? ? ? ? ? count++;

? ? ? ? ? ? ? ? ? ? ? ? ? sparseArr[count][0] = i;

? ? ? ? ? ? ? ? ? ? ? ? ? sparseArr[count][1] = j;

? ? ? ? ? ? ? ? ? ? ? ? ? sparseArr[count][2] = chessArr1[i][j];

}

}

}

// 輸出稀疏數(shù)組的形式

System.out.println();

System.out.println("得到稀疏數(shù)組為~~~~");

for (int i = 0; i < sparseArr.length; i++) {

System.out.printf("%d\t%d\t%d\t\n", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);

}

System.out.println();



//將稀疏數(shù)組 --》 恢復(fù)成 原始的二維數(shù)組

/*

*? 1. 先讀取稀疏數(shù)組的第一行痢虹,根據(jù)第一行的數(shù)據(jù),創(chuàng)建原始的二維數(shù)組主儡,比如上面的? chessArr2 = int [11][11]

2. 在讀取稀疏數(shù)組后幾行的數(shù)據(jù)奖唯,并賦給 原始的二維數(shù)組 即可.

*/

//1. 先讀取稀疏數(shù)組的第一行,根據(jù)第一行的數(shù)據(jù)糜值,創(chuàng)建原始的二維數(shù)組

int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];

//2. 在讀取稀疏數(shù)組后幾行的數(shù)據(jù)(從第二行開始)丰捷,并賦給 原始的二維數(shù)組 即可

for(int i = 1; i < sparseArr.length; i++) {

chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];

}

// 輸出恢復(fù)后的二維數(shù)組

System.out.println();

System.out.println("恢復(fù)后的二維數(shù)組");

for (int[] row : chessArr2) {

for (int data : row) {

System.out.printf("%d\t", data);

}

System.out.println();

}

}

}




隊(duì)列







package com.atguigu.queue;

import java.util.Scanner;

public class ArrayQueueDemo {

public static void main(String[] args) {

//測(cè)試一把

//創(chuàng)建一個(gè)隊(duì)列

ArrayQueue queue = new ArrayQueue(3);

char key = ' '; //接收用戶輸入

Scanner scanner = new Scanner(System.in);//

boolean loop = true;

//輸出一個(gè)菜單

while(loop) {

System.out.println("s(show): 顯示隊(duì)列");

System.out.println("e(exit): 退出程序");

System.out.println("a(add): 添加數(shù)據(jù)到隊(duì)列");

System.out.println("g(get): 從隊(duì)列取出數(shù)據(jù)");

System.out.println("h(head): 查看隊(duì)列頭的數(shù)據(jù)");

key = scanner.next().charAt(0);//接收一個(gè)字符

switch (key) {

case 's':

queue.showQueue();

break;

case 'a':

System.out.println("輸出一個(gè)數(shù)");

int value = scanner.nextInt();

queue.addQueue(value);

break;

case 'g': //取出數(shù)據(jù)

try {

int res = queue.getQueue();

System.out.printf("取出的數(shù)據(jù)是%d\n", res);

} catch (Exception e) {

// TODO: handle exception

System.out.println(e.getMessage());

}

break;

case 'h': //查看隊(duì)列頭的數(shù)據(jù)

try {

int res = queue.headQueue();

System.out.printf("隊(duì)列頭的數(shù)據(jù)是%d\n", res);

} catch (Exception e) {

// TODO: handle exception

System.out.println(e.getMessage());

}

break;

case 'e': //退出

scanner.close();

loop = false;

break;

default:

break;

}

}

System.out.println("程序退出~~");

}

}

// 使用數(shù)組模擬隊(duì)列-編寫一個(gè)ArrayQueue類

class ArrayQueue {

private int maxSize; // 表示數(shù)組的最大容量

private int front; // 隊(duì)列頭

private int rear; // 隊(duì)列尾

private int[] arr; // 該數(shù)據(jù)用于存放數(shù)據(jù), 模擬隊(duì)列

// 創(chuàng)建隊(duì)列的構(gòu)造器

public ArrayQueue(int arrMaxSize) {

maxSize = arrMaxSize;

arr = new int[maxSize];

front = -1; // 指向隊(duì)列頭部,分析出front是指向隊(duì)列頭的前一個(gè)位置.

rear = -1; // 指向隊(duì)列尾寂汇,指向隊(duì)列尾的數(shù)據(jù)(即就是隊(duì)列最后一個(gè)數(shù)據(jù))

}

// 判斷隊(duì)列是否滿

public boolean isFull() {

return rear == maxSize - 1;

}

// 判斷隊(duì)列是否為空

public boolean isEmpty() {

return rear == front;

}

// 添加數(shù)據(jù)到隊(duì)列

public void addQueue(int n) {

// 判斷隊(duì)列是否滿

if (isFull()) {

System.out.println("隊(duì)列滿病往,不能加入數(shù)據(jù)~");

return;

}

rear++; // 讓rear 后移

arr[rear] = n;

}

// 獲取隊(duì)列的數(shù)據(jù), 出隊(duì)列

public int getQueue() {

// 判斷隊(duì)列是否空

if (isEmpty()) {

// 通過拋出異常

throw new RuntimeException("隊(duì)列空,不能取數(shù)據(jù)");

}

front++; // front后移

return arr[front];

}

// 顯示隊(duì)列的所有數(shù)據(jù)

public void showQueue() {

// 遍歷

if (isEmpty()) {

System.out.println("隊(duì)列空的骄瓣,沒有數(shù)據(jù)~~");

return;

}

for (int i = 0; i < arr.length; i++) {

System.out.printf("arr[%d]=%d\n", i, arr[i]);

}

}

// 顯示隊(duì)列的頭數(shù)據(jù)停巷, 注意不是取出數(shù)據(jù)

public int headQueue() {

// 判斷

if (isEmpty()) {

throw new RuntimeException("隊(duì)列空的,沒有數(shù)據(jù)~~");

}

return arr[front + 1];

}

}



package com.atguigu.queue;

import java.util.Scanner;

public class CircleArrayQueueDemo {

public static void main(String[] args) {

//測(cè)試一把

System.out.println("測(cè)試數(shù)組模擬環(huán)形隊(duì)列的案例~~~");

// 創(chuàng)建一個(gè)環(huán)形隊(duì)列

CircleArray queue = new CircleArray(4); //說明設(shè)置4, 其隊(duì)列的有效數(shù)據(jù)最大是3

char key = ' '; // 接收用戶輸入

Scanner scanner = new Scanner(System.in);//

boolean loop = true;

// 輸出一個(gè)菜單

while (loop) {

System.out.println("s(show): 顯示隊(duì)列");

System.out.println("e(exit): 退出程序");

System.out.println("a(add): 添加數(shù)據(jù)到隊(duì)列");

System.out.println("g(get): 從隊(duì)列取出數(shù)據(jù)");

System.out.println("h(head): 查看隊(duì)列頭的數(shù)據(jù)");

key = scanner.next().charAt(0);// 接收一個(gè)字符

switch (key) {

case 's':

queue.showQueue();

break;

case 'a':

System.out.println("輸出一個(gè)數(shù)");

int value = scanner.nextInt();

queue.addQueue(value);

break;

case 'g': // 取出數(shù)據(jù)

try {

int res = queue.getQueue();

System.out.printf("取出的數(shù)據(jù)是%d\n", res);

} catch (Exception e) {

// TODO: handle exception

System.out.println(e.getMessage());

}

break;

case 'h': // 查看隊(duì)列頭的數(shù)據(jù)

try {

int res = queue.headQueue();

System.out.printf("隊(duì)列頭的數(shù)據(jù)是%d\n", res);

} catch (Exception e) {

// TODO: handle exception

System.out.println(e.getMessage());

}

break;

case 'e': // 退出

scanner.close();

loop = false;

break;

default:

break;

}

}

System.out.println("程序退出~~");

}

}

class CircleArray {

private int maxSize; // 表示數(shù)組的最大容量

//front 變量的含義做一個(gè)調(diào)整: front 就指向隊(duì)列的第一個(gè)元素, 也就是說 arr[front] 就是隊(duì)列的第一個(gè)元素

//front 的初始值 = 0

private int front;

//rear 變量的含義做一個(gè)調(diào)整:rear 指向隊(duì)列的最后一個(gè)元素的后一個(gè)位置. 因?yàn)橄M粘鲆粋€(gè)空間做為約定.

//rear 的初始值 = 0

private int rear; // 隊(duì)列尾

private int[] arr; // 該數(shù)據(jù)用于存放數(shù)據(jù), 模擬隊(duì)列

public CircleArray(int arrMaxSize) {

maxSize = arrMaxSize;

arr = new int[maxSize];

}

// 判斷隊(duì)列是否滿

public boolean isFull() {

return (rear? + 1) % maxSize == front;

}

// 判斷隊(duì)列是否為空

public boolean isEmpty() {

return rear == front;

}

// 添加數(shù)據(jù)到隊(duì)列

public void addQueue(int n) {

// 判斷隊(duì)列是否滿

if (isFull()) {

System.out.println("隊(duì)列滿榕栏,不能加入數(shù)據(jù)~");

return;

}

//直接將數(shù)據(jù)加入

arr[rear] = n;

//將 rear 后移, 這里必須考慮取模

rear = (rear + 1) % maxSize;

}

// 獲取隊(duì)列的數(shù)據(jù), 出隊(duì)列

public int getQueue() {

// 判斷隊(duì)列是否空

if (isEmpty()) {

// 通過拋出異常

throw new RuntimeException("隊(duì)列空畔勤,不能取數(shù)據(jù)");

}

// 這里需要分析出 front是指向隊(duì)列的第一個(gè)元素

// 1. 先把 front 對(duì)應(yīng)的值保留到一個(gè)臨時(shí)變量

// 2. 將 front 后移, 考慮取模

// 3. 將臨時(shí)保存的變量返回

int value = arr[front];

front = (front + 1) % maxSize;

return value;

}

// 顯示隊(duì)列的所有數(shù)據(jù)

public void showQueue() {

// 遍歷

if (isEmpty()) {

System.out.println("隊(duì)列空的,沒有數(shù)據(jù)~~");

return;

}

// 思路:從front開始遍歷扒磁,遍歷多少個(gè)元素

// 動(dòng)腦筋

for (int i = front; i < front + size() ; i++) {

System.out.printf("arr[%d]=%d\n", i % maxSize, arr[i % maxSize]);

}

}

// 求出當(dāng)前隊(duì)列有效數(shù)據(jù)的個(gè)數(shù)

public int size() {

// rear = 2

// front = 1

// maxSize = 3

return (rear + maxSize - front) % maxSize;?

}

// 顯示隊(duì)列的頭數(shù)據(jù)庆揪, 注意不是取出數(shù)據(jù)

public int headQueue() {

// 判斷

if (isEmpty()) {

throw new RuntimeException("隊(duì)列空的,沒有數(shù)據(jù)~~");

}

return arr[front];

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末妨托,一起剝皮案震驚了整個(gè)濱河市缸榛,隨后出現(xiàn)的幾起案子检访,更是在濱河造成了極大的恐慌,老刑警劉巖仔掸,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脆贵,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡起暮,警方通過查閱死者的電腦和手機(jī)卖氨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來负懦,“玉大人筒捺,你說我怎么就攤上這事≈嚼鳎” “怎么了系吭?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)颗品。 經(jīng)常有香客問我肯尺,道長(zhǎng),這世上最難降的妖魔是什么躯枢? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任则吟,我火速辦了婚禮,結(jié)果婚禮上锄蹂,老公的妹妹穿的比我還像新娘氓仲。我一直安慰自己,他們只是感情好得糜,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布敬扛。 她就那樣靜靜地躺著,像睡著了一般朝抖。 火紅的嫁衣襯著肌膚如雪啥箭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天槽棍,我揣著相機(jī)與錄音捉蚤,去河邊找鬼抬驴。 笑死炼七,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的布持。 我是一名探鬼主播豌拙,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼题暖!你這毒婦竟也來了按傅?” 一聲冷哼從身側(cè)響起捉超,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎唯绍,沒想到半個(gè)月后拼岳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡况芒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年惜纸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绝骚。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡耐版,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出压汪,到底是詐尸還是另有隱情粪牲,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布止剖,位于F島的核電站腺阳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏穿香。R本人自食惡果不足惜舌狗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扔水。 院中可真熱鬧痛侍,春花似錦、人聲如沸魔市。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽待德。三九已至君丁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間将宪,已是汗流浹背绘闷。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留较坛,地道東北人印蔗。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像丑勤,于是被迫代替她去往敵國(guó)和親华嘹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容