From a0edb262ffd8607341ba2a67f0034f7a59d80614 Mon Sep 17 00:00:00 2001 From: steak-zhuo Date: Tue, 17 Jan 2023 01:00:09 +0800 Subject: [PATCH 1/7] add deque in javascript and typescript --- .../chapter_stack_and_queue/deque.js | 104 +++++++++++++++++ .../chapter_stack_and_queue/deque.ts | 106 ++++++++++++++++++ 2 files changed, 210 insertions(+) create mode 100644 codes/javascript/chapter_stack_and_queue/deque.js create mode 100644 codes/typescript/chapter_stack_and_queue/deque.ts diff --git a/codes/javascript/chapter_stack_and_queue/deque.js b/codes/javascript/chapter_stack_and_queue/deque.js new file mode 100644 index 0000000000..f8297cf646 --- /dev/null +++ b/codes/javascript/chapter_stack_and_queue/deque.js @@ -0,0 +1,104 @@ +/** + * File: deque.js + * Created Time: 2022-12-29 + * Author: Zhuo Qinyue (1403450829@qq.com) + */ + +/* 基于数组方法实现的双端队列 */ +class Deque { + array; + len; + constructor() { + this.len = 0; + this.array = []; + } + + /* 在队尾添加元素 */ + pushBack(value) { + this.array.push(value); + this.len++; + } + + /* 在队首添加元素 */ + pushFront(value) { + this.array.unshift(value); + this.len++; + } + + /* 删除队尾元素 */ + popBack() { + this.len--; + return this.array.pop(); + } + + /* 删除队首元素 */ + popFront() { + this.len--; + return this.array.shift(); + } + + /* 访问队尾元素 */ + peekLast() { + return this.array[this.len - 1]; + } + + /* 访问队首元素 */ + peekFirst() { + return this.array[0]; + } + + /* 判断队列是否为空 */ + isEmpty() { + return this.len === 0; + } + + /* 获取队列的长度 */ + size() { + return this.len; + } + + /* 打印队列 */ + printDeque() { + let str = ''; + for (let i = 0; i < this.array.length; i++) { + str += this.array[i]; + if (i < this.array.length - 1) str += ', '; + } + console.log(str); + }; + +} + +/* 初始化双向队列 */ +const deque = new Deque(); + +/* 元素入队 */ +deque.pushBack(2); +deque.pushBack(5); +deque.pushBack(4); +deque.pushFront(3); +deque.pushFront(1); +console.log("双向队列 deque = "); +deque.printDeque(); + +/* 访问元素 */ +const peekFirst = deque.peekFirst(); +console.log("队首元素 peekFirst = " + peekFirst); +const peekLast = deque.peekLast(); +console.log("队尾元素 peekLast = " + peekLast); + +/* 元素出队 */ +const popFront = deque.popFront(); +console.log("队首出队元素 popFront = " + popFront + ",队首出队后 deque = "); +deque.printDeque(); +const popBack = deque.popBack(); +console.log("队尾出队元素 popBack = " + popBack + ",队尾出队后 deque = "); +deque.printDeque(); + +/* 获取双向队列的长度 */ +const size = deque.size(); +console.log("双向队列长度 size = " + size); + +/* 判断双向队列是否为空 */ +const isEmpty = deque.isEmpty(); +console.log("双向队列是否为空 = " + isEmpty); \ No newline at end of file diff --git a/codes/typescript/chapter_stack_and_queue/deque.ts b/codes/typescript/chapter_stack_and_queue/deque.ts new file mode 100644 index 0000000000..bfad0fe216 --- /dev/null +++ b/codes/typescript/chapter_stack_and_queue/deque.ts @@ -0,0 +1,106 @@ +/** + * File: deque.ts + * Created Time: 2022-12-29 + * Author: Zhuo Qinyue (1403450829@qq.com) + */ + +/* 基于数组方法实现的双端队列 */ +class Deque { + array: number[]; + len: number; + constructor() { + this.len = 0; + this.array = []; + } + + /* 在队尾添加元素 */ + pushBack(value: number): void { + this.array.push(value); + this.len++; + } + + /* 在队首添加元素 */ + pushFront(value: number): void { + this.array.unshift(value); + this.len++; + } + + /* 删除队尾元素 */ + popBack(): number | undefined { + this.len--; + return this.array.pop(); + } + + /* 删除队首元素 */ + popFront(): number | undefined { + this.len--; + return this.array.shift(); + } + + /* 访问队尾元素 */ + peekLast(): number { + return this.array[this.len - 1]; + } + + /* 访问队首元素 */ + peekFirst(): number { + return this.array[0]; + } + + /* 判断队列是否为空 */ + isEmpty(): boolean { + return this.len === 0; + } + + /* 获取队列的长度 */ + size(): number { + return this.len; + } + + /* 打印队列 */ + printDeque(): void { + let str = ''; + for (let i = 0; i < this.array.length; i++) { + str += this.array[i]; + if (i < this.array.length - 1) str += ', '; + } + console.log(str); + }; + +} + +/* 初始化双向队列 */ +const deque: Deque = new Deque(); + +/* 元素入队 */ +deque.pushBack(2); +deque.pushBack(5); +deque.pushBack(4); +deque.pushFront(3); +deque.pushFront(1); +console.log("双向队列 deque = "); +deque.printDeque(); + +/* 访问元素 */ +const peekFirst: number = deque.peekFirst(); +console.log("队首元素 peekFirst = " + peekFirst); +const peekLast: number = deque.peekLast(); +console.log("队尾元素 peekLast = " + peekLast); + +/* 元素出队 */ +const pollFirst: number | undefined = deque.popFront(); +console.log("队首出队元素 pollFirst = " + pollFirst + ",队首出队后 deque = "); +deque.printDeque(); +const pollLast: number | undefined = deque.popBack(); +console.log("队尾出队元素 pollLast = " + pollLast + ",队尾出队后 deque = "); +deque.printDeque(); + +/* 获取双向队列的长度 */ +const size: number = deque.size(); +console.log("双向队列长度 size = " + size); + +/* 判断双向队列是否为空 */ +const isEmpty: boolean = deque.isEmpty(); +console.log("双向队列是否为空 = " + isEmpty); + +export { }; \ No newline at end of file From 9a0ae5f0310b01bb3bc5ccc2fb6bc853a8980430 Mon Sep 17 00:00:00 2001 From: steak-zhuo Date: Tue, 17 Jan 2023 01:16:43 +0800 Subject: [PATCH 2/7] update the variables name --- .../chapter_stack_and_queue/deque.js | 10 +++------- .../chapter_stack_and_queue/deque.ts | 18 +++++++----------- 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/codes/javascript/chapter_stack_and_queue/deque.js b/codes/javascript/chapter_stack_and_queue/deque.js index f8297cf646..ae49e42ff4 100644 --- a/codes/javascript/chapter_stack_and_queue/deque.js +++ b/codes/javascript/chapter_stack_and_queue/deque.js @@ -1,6 +1,6 @@ /** * File: deque.js - * Created Time: 2022-12-29 + * Created Time: 2023-01-17 * Author: Zhuo Qinyue (1403450829@qq.com) */ @@ -59,12 +59,8 @@ class Deque { /* 打印队列 */ printDeque() { - let str = ''; - for (let i = 0; i < this.array.length; i++) { - str += this.array[i]; - if (i < this.array.length - 1) str += ', '; - } - console.log(str); + const dequeStr = this.array.join(', ') + console.log(dequeStr); }; } diff --git a/codes/typescript/chapter_stack_and_queue/deque.ts b/codes/typescript/chapter_stack_and_queue/deque.ts index bfad0fe216..f8ab40bd30 100644 --- a/codes/typescript/chapter_stack_and_queue/deque.ts +++ b/codes/typescript/chapter_stack_and_queue/deque.ts @@ -1,6 +1,6 @@ /** * File: deque.ts - * Created Time: 2022-12-29 + * Created Time: 2023-01-17 * Author: Zhuo Qinyue (1403450829@qq.com) */ @@ -59,12 +59,8 @@ class Deque { /* 打印队列 */ printDeque(): void { - let str = ''; - for (let i = 0; i < this.array.length; i++) { - str += this.array[i]; - if (i < this.array.length - 1) str += ', '; - } - console.log(str); + const dequeStr: string = this.array.join(', ') + console.log(dequeStr); }; } @@ -88,11 +84,11 @@ const peekLast: number = deque.peekLast(); console.log("队尾元素 peekLast = " + peekLast); /* 元素出队 */ -const pollFirst: number | undefined = deque.popFront(); -console.log("队首出队元素 pollFirst = " + pollFirst + ",队首出队后 deque = "); +const popFront: number | undefined = deque.popFront(); +console.log("队首出队元素 popFront = " + popFront + ",队首出队后 deque = "); deque.printDeque(); -const pollLast: number | undefined = deque.popBack(); -console.log("队尾出队元素 pollLast = " + pollLast + ",队尾出队后 deque = "); +const popBack: number | undefined = deque.popBack(); +console.log("队尾出队元素 popBack = " + popBack + ",队尾出队后 deque = "); deque.printDeque(); /* 获取双向队列的长度 */ From d15da60e56d87b23e3ca30230a7fcc68794be7f8 Mon Sep 17 00:00:00 2001 From: steak-zhuo Date: Wed, 1 Feb 2023 23:14:55 +0800 Subject: [PATCH 3/7] update the time complexity --- codes/typescript/chapter_stack_and_queue/deque.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/codes/typescript/chapter_stack_and_queue/deque.ts b/codes/typescript/chapter_stack_and_queue/deque.ts index f8ab40bd30..1144e7514c 100644 --- a/codes/typescript/chapter_stack_and_queue/deque.ts +++ b/codes/typescript/chapter_stack_and_queue/deque.ts @@ -19,7 +19,7 @@ class Deque { this.len++; } - /* 在队首添加元素 */ + /* 在队首添加元素, 时间复杂度: O(n) */ pushFront(value: number): void { this.array.unshift(value); this.len++; @@ -31,7 +31,7 @@ class Deque { return this.array.pop(); } - /* 删除队首元素 */ + /* 删除队首元素, 时间复杂度: O(n) */ popFront(): number | undefined { this.len--; return this.array.shift(); From ed088493ab62afaf02deac36d67300bdbeff52fa Mon Sep 17 00:00:00 2001 From: steak-zhuo Date: Thu, 2 Feb 2023 02:10:31 +0800 Subject: [PATCH 4/7] Directly operating on the Array --- .../chapter_stack_and_queue/deque.js | 95 +++--------------- .../chapter_stack_and_queue/deque.ts | 97 ++++--------------- 2 files changed, 33 insertions(+), 159 deletions(-) diff --git a/codes/javascript/chapter_stack_and_queue/deque.js b/codes/javascript/chapter_stack_and_queue/deque.js index ae49e42ff4..ea2ccf8ee8 100644 --- a/codes/javascript/chapter_stack_and_queue/deque.js +++ b/codes/javascript/chapter_stack_and_queue/deque.js @@ -4,97 +4,34 @@ * Author: Zhuo Qinyue (1403450829@qq.com) */ -/* 基于数组方法实现的双端队列 */ -class Deque { - array; - len; - constructor() { - this.len = 0; - this.array = []; - } - - /* 在队尾添加元素 */ - pushBack(value) { - this.array.push(value); - this.len++; - } - - /* 在队首添加元素 */ - pushFront(value) { - this.array.unshift(value); - this.len++; - } - - /* 删除队尾元素 */ - popBack() { - this.len--; - return this.array.pop(); - } - - /* 删除队首元素 */ - popFront() { - this.len--; - return this.array.shift(); - } - - /* 访问队尾元素 */ - peekLast() { - return this.array[this.len - 1]; - } - - /* 访问队首元素 */ - peekFirst() { - return this.array[0]; - } - - /* 判断队列是否为空 */ - isEmpty() { - return this.len === 0; - } - - /* 获取队列的长度 */ - size() { - return this.len; - } - - /* 打印队列 */ - printDeque() { - const dequeStr = this.array.join(', ') - console.log(dequeStr); - }; - -} - /* 初始化双向队列 */ -const deque = new Deque(); +/* JavaScript 没有内置的双端队列,可以把 Array 当作双端队列来使用 */ +const deque = []; /* 元素入队 */ -deque.pushBack(2); -deque.pushBack(5); -deque.pushBack(4); -deque.pushFront(3); -deque.pushFront(1); -console.log("双向队列 deque = "); -deque.printDeque(); +deque.push(2); +deque.push(5); +deque.push(4); +deque.unshift(3); +deque.unshift(1); +console.log("双向队列 deque = ", deque); /* 访问元素 */ -const peekFirst = deque.peekFirst(); +const peekFirst = deque[0]; console.log("队首元素 peekFirst = " + peekFirst); -const peekLast = deque.peekLast(); +const peekLast = deque[deque.length - 1]; console.log("队尾元素 peekLast = " + peekLast); /* 元素出队 */ -const popFront = deque.popFront(); -console.log("队首出队元素 popFront = " + popFront + ",队首出队后 deque = "); -deque.printDeque(); -const popBack = deque.popBack(); -console.log("队尾出队元素 popBack = " + popBack + ",队尾出队后 deque = "); -deque.printDeque(); +const popFront = deque.shift(); +console.log("队首出队元素 popFront = " + popFront + ",队首出队后 deque = " + deque); +const popBack = deque.pop(); +console.log("队尾出队元素 popBack = " + popBack + ",队尾出队后 deque = " + deque); /* 获取双向队列的长度 */ -const size = deque.size(); +const size = deque.length; console.log("双向队列长度 size = " + size); /* 判断双向队列是否为空 */ -const isEmpty = deque.isEmpty(); +const isEmpty = size === 0; console.log("双向队列是否为空 = " + isEmpty); \ No newline at end of file diff --git a/codes/typescript/chapter_stack_and_queue/deque.ts b/codes/typescript/chapter_stack_and_queue/deque.ts index 1144e7514c..b245dadbf5 100644 --- a/codes/typescript/chapter_stack_and_queue/deque.ts +++ b/codes/typescript/chapter_stack_and_queue/deque.ts @@ -1,102 +1,39 @@ /** - * File: deque.ts + * File: deque.js * Created Time: 2023-01-17 * Author: Zhuo Qinyue (1403450829@qq.com) */ -/* 基于数组方法实现的双端队列 */ -class Deque { - array: number[]; - len: number; - constructor() { - this.len = 0; - this.array = []; - } - - /* 在队尾添加元素 */ - pushBack(value: number): void { - this.array.push(value); - this.len++; - } - - /* 在队首添加元素, 时间复杂度: O(n) */ - pushFront(value: number): void { - this.array.unshift(value); - this.len++; - } - - /* 删除队尾元素 */ - popBack(): number | undefined { - this.len--; - return this.array.pop(); - } - - /* 删除队首元素, 时间复杂度: O(n) */ - popFront(): number | undefined { - this.len--; - return this.array.shift(); - } - - /* 访问队尾元素 */ - peekLast(): number { - return this.array[this.len - 1]; - } - - /* 访问队首元素 */ - peekFirst(): number { - return this.array[0]; - } - - /* 判断队列是否为空 */ - isEmpty(): boolean { - return this.len === 0; - } - - /* 获取队列的长度 */ - size(): number { - return this.len; - } - - /* 打印队列 */ - printDeque(): void { - const dequeStr: string = this.array.join(', ') - console.log(dequeStr); - }; - -} - /* 初始化双向队列 */ -const deque: Deque = new Deque(); +/* JavaScript 没有内置的双端队列,可以把 Array 当作双端队列来使用 */ +const deque: number[] = []; /* 元素入队 */ -deque.pushBack(2); -deque.pushBack(5); -deque.pushBack(4); -deque.pushFront(3); -deque.pushFront(1); -console.log("双向队列 deque = "); -deque.printDeque(); +deque.push(2); +deque.push(5); +deque.push(4); +deque.unshift(3); +deque.unshift(1); +console.log("双向队列 deque = ", deque); /* 访问元素 */ -const peekFirst: number = deque.peekFirst(); +const peekFirst: number = deque[0]; console.log("队首元素 peekFirst = " + peekFirst); -const peekLast: number = deque.peekLast(); +const peekLast: number = deque[deque.length - 1]; console.log("队尾元素 peekLast = " + peekLast); /* 元素出队 */ -const popFront: number | undefined = deque.popFront(); -console.log("队首出队元素 popFront = " + popFront + ",队首出队后 deque = "); -deque.printDeque(); -const popBack: number | undefined = deque.popBack(); -console.log("队尾出队元素 popBack = " + popBack + ",队尾出队后 deque = "); -deque.printDeque(); +const popFront: number = deque.shift() as number; +console.log("队首出队元素 popFront = " + popFront + ",队首出队后 deque = " + deque); +const popBack: number = deque.pop() as number; +console.log("队尾出队元素 popBack = " + popBack + ",队尾出队后 deque = " + deque); /* 获取双向队列的长度 */ -const size: number = deque.size(); +const size: number = deque.length; console.log("双向队列长度 size = " + size); /* 判断双向队列是否为空 */ -const isEmpty: boolean = deque.isEmpty(); +const isEmpty: boolean = size === 0; console.log("双向队列是否为空 = " + isEmpty); export { }; \ No newline at end of file From 16f3ef4b40e7da4977026a8bf4065bf7149a1967 Mon Sep 17 00:00:00 2001 From: steak-zhuo Date: Thu, 2 Feb 2023 03:21:08 +0800 Subject: [PATCH 5/7] fix the ts file --- codes/typescript/chapter_stack_and_queue/deque.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/codes/typescript/chapter_stack_and_queue/deque.ts b/codes/typescript/chapter_stack_and_queue/deque.ts index b245dadbf5..e3f8afbef3 100644 --- a/codes/typescript/chapter_stack_and_queue/deque.ts +++ b/codes/typescript/chapter_stack_and_queue/deque.ts @@ -1,5 +1,5 @@ /** - * File: deque.js + * File: deque.ts * Created Time: 2023-01-17 * Author: Zhuo Qinyue (1403450829@qq.com) */ @@ -36,4 +36,4 @@ console.log("双向队列长度 size = " + size); const isEmpty: boolean = size === 0; console.log("双向队列是否为空 = " + isEmpty); -export { }; \ No newline at end of file +export {}; \ No newline at end of file From 3d3fa2c0ed3c2d71475b1659184d291d84f6a95a Mon Sep 17 00:00:00 2001 From: steak-zhuo Date: Thu, 2 Feb 2023 03:29:59 +0800 Subject: [PATCH 6/7] update the method complexity --- codes/typescript/chapter_stack_and_queue/deque.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/codes/typescript/chapter_stack_and_queue/deque.ts b/codes/typescript/chapter_stack_and_queue/deque.ts index e3f8afbef3..16190ee018 100644 --- a/codes/typescript/chapter_stack_and_queue/deque.ts +++ b/codes/typescript/chapter_stack_and_queue/deque.ts @@ -12,6 +12,7 @@ const deque: number[] = []; deque.push(2); deque.push(5); deque.push(4); +/* unshift() 方法的时间复杂度为 O(n) */ deque.unshift(3); deque.unshift(1); console.log("双向队列 deque = ", deque); @@ -23,6 +24,7 @@ const peekLast: number = deque[deque.length - 1]; console.log("队尾元素 peekLast = " + peekLast); /* 元素出队 */ +/* shift() 方法的时间复杂度为 O(n) */ const popFront: number = deque.shift() as number; console.log("队首出队元素 popFront = " + popFront + ",队首出队后 deque = " + deque); const popBack: number = deque.pop() as number; From 8c69eb3b47789c46fb010352d6167544865a39ed Mon Sep 17 00:00:00 2001 From: steak-zhuo Date: Thu, 2 Feb 2023 03:31:49 +0800 Subject: [PATCH 7/7] update the js file --- codes/javascript/chapter_stack_and_queue/deque.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/codes/javascript/chapter_stack_and_queue/deque.js b/codes/javascript/chapter_stack_and_queue/deque.js index ea2ccf8ee8..aadab852ed 100644 --- a/codes/javascript/chapter_stack_and_queue/deque.js +++ b/codes/javascript/chapter_stack_and_queue/deque.js @@ -12,6 +12,7 @@ const deque = []; deque.push(2); deque.push(5); deque.push(4); +/* unshift() 方法的时间复杂度为 O(n) */ deque.unshift(3); deque.unshift(1); console.log("双向队列 deque = ", deque); @@ -23,6 +24,7 @@ const peekLast = deque[deque.length - 1]; console.log("队尾元素 peekLast = " + peekLast); /* 元素出队 */ +/* shift() 方法的时间复杂度为 O(n) */ const popFront = deque.shift(); console.log("队首出队元素 popFront = " + popFront + ",队首出队后 deque = " + deque); const popBack = deque.pop();