Compare commits

..

4 Commits

Author SHA1 Message Date
40a676cd31
feat: 利用递归排序一个栈 2025-03-07 21:36:05 +08:00
9a4d2d388f
feat: 逆序一个栈 2025-03-07 20:25:12 +08:00
27d3b489e3
feat: 添加栈数据结构 2025-03-07 20:24:37 +08:00
89042e81a8
fix: eslint和prettier冲突 2025-03-07 18:41:49 +08:00
8 changed files with 206 additions and 39 deletions

10
.vscode/settings.json vendored
View File

@ -2,7 +2,11 @@
"C_Cpp.clang_format_fallbackStyle": "LLVM",
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "always"
}
},
"editor.defaultFormatter": "esbenp.prettier-vscode", // 使 Prettier
"editor.formatOnSave": true, //
"prettier.requireConfig": true, // Prettier
"eslint.alwaysShowStatus": true, // ESLint
"eslint.format.enable": true // ESLint
}

View File

@ -1 +1 @@
export * from './link-list.js'
export * from './link-list.js';

79
package-lock.json generated
View File

@ -9,11 +9,12 @@
"version": "1.0.0",
"license": "ISC",
"devDependencies": {
"eslint": "^8.57.0",
"eslint": "^8.57.1",
"eslint-config-airbnb-base": "^15.0.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-prettier": "^5.1.3"
"eslint-plugin-prettier": "^5.2.3",
"prettier": "^3.5.3"
}
},
"node_modules/@aashutoshrathi/word-wrap": {
@ -73,21 +74,24 @@
}
},
"node_modules/@eslint/js": {
"version": "8.57.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
"integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
"version": "8.57.1",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
"integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
"node_modules/@humanwhocodes/config-array": {
"version": "0.11.14",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
"integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
"version": "0.13.0",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
"integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
"deprecated": "Use @eslint/config-array instead",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@humanwhocodes/object-schema": "^2.0.2",
"@humanwhocodes/object-schema": "^2.0.3",
"debug": "^4.3.1",
"minimatch": "^3.0.5"
},
@ -109,10 +113,12 @@
}
},
"node_modules/@humanwhocodes/object-schema": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz",
"integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==",
"dev": true
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
"integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
"deprecated": "Use @eslint/object-schema instead",
"dev": true,
"license": "BSD-3-Clause"
},
"node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
@ -154,6 +160,7 @@
"resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz",
"integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==",
"dev": true,
"license": "MIT",
"engines": {
"node": "^12.20.0 || ^14.18.0 || >=16.0.0"
},
@ -694,16 +701,18 @@
}
},
"node_modules/eslint": {
"version": "8.57.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
"integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
"version": "8.57.1",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
"integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
"deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1",
"@eslint/eslintrc": "^2.1.4",
"@eslint/js": "8.57.0",
"@humanwhocodes/config-array": "^0.11.14",
"@eslint/js": "8.57.1",
"@humanwhocodes/config-array": "^0.13.0",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
"@ungap/structured-clone": "^1.2.0",
@ -772,6 +781,7 @@
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz",
"integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==",
"dev": true,
"license": "MIT",
"bin": {
"eslint-config-prettier": "bin/cli.js"
},
@ -878,13 +888,14 @@
}
},
"node_modules/eslint-plugin-prettier": {
"version": "5.1.3",
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz",
"integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==",
"version": "5.2.3",
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.3.tgz",
"integrity": "sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw==",
"dev": true,
"license": "MIT",
"dependencies": {
"prettier-linter-helpers": "^1.0.0",
"synckit": "^0.8.6"
"synckit": "^0.9.1"
},
"engines": {
"node": "^14.18.0 || >=16.0.0"
@ -1962,11 +1973,11 @@
}
},
"node_modules/prettier": {
"version": "3.2.5",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz",
"integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==",
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz",
"integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==",
"dev": true,
"peer": true,
"license": "MIT",
"bin": {
"prettier": "bin/prettier.cjs"
},
@ -2328,10 +2339,11 @@
}
},
"node_modules/synckit": {
"version": "0.8.8",
"resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz",
"integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==",
"version": "0.9.2",
"resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz",
"integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@pkgr/core": "^0.1.0",
"tslib": "^2.6.2"
@ -2362,10 +2374,11 @@
}
},
"node_modules/tslib": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
"dev": true
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"dev": true,
"license": "0BSD"
},
"node_modules/type-check": {
"version": "0.4.0",

View File

@ -21,10 +21,11 @@
"author": "yigencong",
"license": "ISC",
"devDependencies": {
"eslint": "^8.57.0",
"eslint": "^8.57.1",
"eslint-config-airbnb-base": "^15.0.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-prettier": "^5.1.3"
"eslint-plugin-prettier": "^5.2.3",
"prettier": "^3.5.3"
}
}

3
recursion/recursion.md Normal file
View File

@ -0,0 +1,3 @@
# 递归
此目录存放了常用递归思路,以及一些解决方案

View File

@ -0,0 +1,61 @@
/**
* @param {Stack} stack
* @description 将一个栈的所有元素按照从栈底到栈顶依此从小到大排列
* 思路假设我们有一个栈[1,7,2,2,5,3]我们把它想象成空的第一步我们插入1由于现在栈是空的所以直接push(1)
* 即可第二步我们插入7,按照要求栈顶的元素应该要比栈底的元素小所以7不能直接push所以我们需要pop(1)之后再
* 判断是否可以插入7当1 弹出后由于没有元素直接push(7),之后我们再把弹出的1重新压入栈顶即可此时栈里面有两个元素
* [7,1],我们继续来压入22比栈顶元素大所以弹出栈顶元素此时发现栈顶元素比2大符合要求所以直接push(2),之后再把之前
* 的1压入即可此时栈里面有3个元素[7,2,1],继续压入2同理之后压入5我们比较栈顶元素和5发现5比栈顶元素大所以弹出
* 1之后再比较发现比此时的栈顶元素2大所以弹出2之后再比较2发现还是大所以继续弹出此时的栈顶元素2之后发现没有7
* 所以此时直接push(5)即可并且把之前弹出的元素依此push即可此时栈里面的内容为[7,5,2,2,1]最后一个元素3同理
*
* 分析上面的思路我们从栈底元素开始处理再不借助另一个后进先出的数据结构我们只能借助递归递归本身就带空间回溯的时候
* 处理即可我们在插入的时候发现每次的弹出的数据都需要保留并且还需要按着原顺序插入在这里我们也需要一个递归的插入函数原因
* 很简单我们需要保留当前弹出的值并且依此插入所以创建两个函数第一个函数sortStack,这个函数把整个栈弹出从栈底元素开始处理
* 依此调用insertInSortedOrder把当前元素插入到正确的地方
*/
import Stack from '../stack/index.js';
/**
* 排序栈
*
* @param {Stack} stack 要排序的栈
*/
function sortStack(stack) {
if (stack.isEmpty()) return; // 如果栈为空,递归终止
const cur = stack.pop(); // 保存栈顶元素
sortStack(stack); // 递归排序栈中的其他元素
// 将当前栈顶元素插入到已排序的栈中
insertInSortedOrder(stack, cur);
}
/**
* 将元素插入到已排序栈中
*
* @param {Stack} stack 要插入的栈
* @param {number} item 要插入的元素
*/
function insertInSortedOrder(stack, item) {
// 如果栈为空,或者栈顶元素大于等于当前元素,直接将当前元素插入栈中
if (stack.isEmpty() || stack.peek() >= item) {
stack.push(item);
} else {
// 如果栈顶元素小于当前元素,弹出栈顶元素
const cur = stack.pop();
// 递归插入当前元素
insertInSortedOrder(stack, item);
// 将弹出的栈顶元素重新压入栈中
stack.push(cur);
}
}
// 测试代码
const stack = new Stack([1, 7, 2, 2, 5, 3]);
console.log('Original Stack:');
stack.print(); // 输出: 1, 7, 2, 2, 5, 3
sortStack(stack); // 排序栈
console.log('Sorted Stack:');
stack.print(); // 输出: 1, 2, 2, 3, 5, 7

View File

@ -0,0 +1,35 @@
import Stack from '../stack/index.js';
/**
*
* @param {Stack} stack 需要处理的栈
* 思路我们首先需要有一个把栈底元素弹出的方法当获取栈底元素之后我们只需把剩余的元素逆序再把这个
* 栈底元素插入栈顶即可
*/
function reverse(stack) {
if (stack.isEmpty()) return;
const last = bottomOut(stack); // 弹出栈的底部元素
reverse(stack);
stack.push(last);
}
/**
*
* @param {Stack} stack - 需要处理的栈
* @description 将一个栈的底部元素弹出
* @return number
*/
function bottomOut(stack) {
const ans = stack.pop();
if (stack.isEmpty()) {
return ans;
}
const last = bottomOut(stack);
stack.push(ans);
return last;
}
const stack = new Stack([1, 2, 3, 4, 5, 6, 7]); // 创建一个栈栈顶元素为5
reverse(stack);
stack.print();

50
stack/index.js Normal file
View File

@ -0,0 +1,50 @@
class Stack {
constructor(items = []) {
this.items = items; // 用 items 来存储栈的元素
}
// 入栈
push(item) {
this.items.push(item);
}
// 出栈
pop() {
if (this.isEmpty()) {
console.log('栈为空! ');
return undefined; // 栈为空时返回 undefined
}
return this.items.pop();
}
// 获取栈顶元素
peek() {
if (this.isEmpty()) {
console.log('栈为空! ');
return undefined; // 栈为空时返回 undefined
}
return this.items[this.items.length - 1];
}
// 判断栈是否为空
isEmpty() {
return this.items.length === 0;
}
// 获取栈的大小
size() {
return this.items.length;
}
// 清空栈
clear() {
this.items = [];
}
// 打印栈内容
print() {
console.log(this.items.toString());
}
}
export default Stack;