跳到主要内容

5. 哈希表(Hash Table)

5. 哈希表(Hash Table)

示例场景:创建一个简单的字典组件,允许用户添加和查询单词及其定义。

import React, { useState } from "react";

function Dictionary() {
const [dictionary, setDictionary] = useState({});
const [word, setWord] = useState("");
const [definition, setDefinition] = useState("");
const [searchResult, setSearchResult] = useState("");

const addWord = () => {
setDictionary({ ...dictionary, [word]: definition });
setWord("");
setDefinition("");
};

const searchWord = () => {
setSearchResult(dictionary[word] || "未找到该单词");
};

return (
<div>
<input
type="text"
placeholder="单词"
value={word}
onChange={(e) => setWord(e.target.value)}
/>
<input
type="text"
placeholder="定义"
value={definition}
onChange={(e) => setDefinition(e.target.value)}
/>
<button onClick={addWord}>添加单词</button>
<button onClick={searchWord}>查询单词</button>
<p>查询结果: {searchResult}</p>
</div>
);
}

export default Dictionary;

6. 树(Tree)

示例场景:创建一个简单的文件夹树组件,允许用户展开和折叠文件夹。

import React, { useState } from "react";

// 定义文件夹树的结构
const folderTree = [
{
name: "Documents",
children: [{ name: "Work" }, { name: "Personal" }],
},
{
name: "Pictures",
children: [{ name: "Vacation" }, { name: "Family" }],
},
];

function FolderTree({ folders }) {
const [expandedFolders, setExpandedFolders] = useState([]);

const toggleFolder = (folderName) => {
if (expandedFolders.includes(folderName)) {
setExpandedFolders(expandedFolders.filter((f) => f !== folderName));
} else {
setExpandedFolders([...expandedFolders, folderName]);
}
};

const renderFolder = (folder) => (
<div key={folder.name}>
<div onClick={() => toggleFolder(folder.name)}>
{expandedFolders.includes(folder.name) ? "▼" : "▶"} {folder.name}
</div>
{expandedFolders.includes(folder.name) && folder.children && (
<div style={{ marginLeft: 20 }}>
{folder.children.map(renderFolder)}
</div>
)}
</div>
);

return <div>{folders.map(renderFolder)}</div>;
}

function App() {
return (
<div>
<h1>文件夹树</h1>
<FolderTree folders={folderTree} />
</div>
);
}

export default App;

7. 图(Graph)

示例场景:创建一个简单的图组件,允许用户添加节点和边,并显示图的结构。

import React, { useState } from "react";

function GraphComponent() {
const [nodes, setNodes] = useState({});
const [edges, setEdges] = useState([]);
const [fromNode, setFromNode] = useState("");
const [toNode, setToNode] = useState("");

const addNode = (nodeName) => {
if (!nodes[nodeName]) {
setNodes({ ...nodes, [nodeName]: true });
}
};

const addEdge = () => {
if (nodes[fromNode] && nodes[toNode]) {
setEdges([...edges, { from: fromNode, to: toNode }]);
}
};

const renderGraph = () => {
return (
<div>
{Object.keys(nodes).map((node) => (
<div key={node}>
{node}{" "}
{edges
.filter((edge) => edge.from === node)
.map((edge) => edge.to)
.join(", ")}
</div>
))}
</div>
);
};

return (
<div>
<input
type="text"
placeholder="节点名称"
onChange={(e) => addNode(e.target.value)}
/>
<input
type="text"
placeholder="起点节点"
value={fromNode}
onChange={(e) => setFromNode(e.target.value)}
/>
<input
type="text"
placeholder="终点节点"
value={toNode}
onChange={(e) => setToNode(e.target.value)}
/>
<button onClick={addEdge}>添加边</button>
<h2>图结构:</h2>
{renderGraph()}
</div>
);
}

export default GraphComponent;

8. 搜索算法(深度优先搜索 DFS)

示例场景:在一个树结构中查找某个节点。

import React, { useState } from "react";

function dfs(tree, target) {
const stack = [tree];
while (stack.length > 0) {
const node = stack.pop();
if (node.name === target) {
return true;
}
if (node.children) {
for (let i = node.children.length - 1; i >= 0; i--) {
stack.push(node.children[i]);
}
}
}
return false;
}

function TreeSearch() {
const [target, setTarget] = useState("");
const [result, setResult] = useState("");

const search = () => {
const found = dfs(folderTree[0], target);
setResult(found ? "找到节点" : "未找到节点");
};

return (
<div>
<input
type="text"
placeholder="目标节点"
value={target}
onChange={(e) => setTarget(e.target.value)}
/>
<button onClick={search}>搜索</button>
<p>{result}</p>
</div>
);
}

function App() {
return (
<div>
<h1>树搜索</h1>
<TreeSearch />
</div>
);
}

export default App;

9. 动态规划(Dynamic Programming)

示例场景:计算斐波那契数列的第 n 项。

import React, { useState } from "react";

function fibonacci(n) {
const dp = [0, 1];
for (let i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}

function FibonacciCalculator() {
const [n, setN] = useState("");
const [result, setResult] = useState("");

const calculate = () => {
const num = parseInt(n, 10);
if (!isNaN(num)) {
setResult(fibonacci(num).toString());
}
};

return (
<div>
<input
type="number"
placeholder="输入n"
value={n}
onChange={(e) => setN(e.target.value)}
/>
<button onClick={calculate}>计算</button>
<p>结果: {result}</p>
</div>
);
}

export default FibonacciCalculator;

这些示例展示了如何在 React 中使用链表、哈希表、树、图、搜索算法和动态规划。希望这些示例能帮助你更好地理解和应用这些数据结构和算法。如果有任何问题或需要进一步的帮助,请随时告诉我!