forked from version1-workspace/ws-0200-js-practice
/
003_data.js
242 lines (219 loc) · 4.99 KB
/
003_data.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
/**
* リストの実装
*
* オブジェクト指向やJavaScriptの組み込みAPIの成り立ちを理解するためにも
* データ構造をクラスで実装してみましょう。
* 実際に使われるリストは要素の型の縛りはありませんが、今回のリストは要素を数値に限定します。
*
* TODO: のついているメソッドを実際に実装してください
*
*/
class List {
data = [];
/**
* Listクラスのインスタンスを作成する。
* @constructor
* @this {List}
* @param {Number} array リストのデータ
*/
constructor(array) {
this.data = array;
}
/** リストの長さを返す
*
* @return {Number}
*/
get size() {
// TODO:
return this.data.length;
}
/** 引数で渡された添字のデータを取得する
*
* @param {Number} index
* @return {Number}
*/
index(index) {
// TODO:
return this.data[index];
}
/** リストの 要素を追加する
*
* @param {Number} item
* @return {Number}
*/
push(item) {
// TODO:
return this.data.push(item);
}
/** 与えられた引数により、リストの 要素を削除する
*
* @param {Number} targetIndex
* @return {Number}
*/
remove(targetIndex) {
// TODO:
const newData = this.data.splice(targetIndex, 1);
for (let value of newData) {
return value;
}
}
/** リストの 末尾の要素を取得する
*
* @param {Number} targetIndex
* @return {Number}
*/
pop() {
// TODO:
return this.data.pop();
}
/** リストの 先頭の要素を取得する
*
* @return {Number}
*/
shift() {
// TODO:
return this.data.shift();
}
/** リストの の中から引数に合致する値を取得する
*
* XXX: find関数は使わずにfor文、while文を活用して実装しましょう
*
* @param {Number} target
* @return {Number | undefined}
*/
find(target) {
// TODO:
for (const value of this.data) {
if (value === target) {
return value;
}
}
}
/** リストの の中から引数に合致する値のindexを取得する。見つからない場合は-1を返す
*
* XXX: findIndex関数は使わずにfor文、while文を活用して実装しましょう
*
* @param {Number} target
* @return {Number}
*/
findIndex(target) {
// TODO:
return this.data.indexOf(target);
}
/** リストの の中から要素に合致する数を取り除く
*
* 実際のデータ(this.data)に変更を加えることなく、新しい配列を返す形で実装しましょう。
*
* XXX: filter関数は使わずにfor文、while文を活用して実装しましょう
*
* @param {Number} target
* @return {List}
*/
filter(target) {
// TODO:
let result = new List(this.data); //Listインスタンスを作成
//自身で作成したsizeを使用
for (let i = 0; i <= result.size; i++) {
//自身で作成したindexを使用
if (result.index(i) === target) {
result.remove(i); //自身で作成したremoveを使用
}
}
return result;
}
}
/**
* スタックの実装
*
* スタックの実装を理解して、要素の追加、取り出しのメソッドをそれぞれ実装しましょう。
* https://qiita.com/drken/items/6a95b57d2e374a3d3292
*
* TODO: のついているメソッドを実際に実装してください
*
*/
class Stack {
data = [];
/** スタックの長さを返す
*
* @return {Number}
*/
get size() {
return this.data.length;
}
/** スタックに要素を追加する
*
* @param {Number} item
*/
push(item) {
// TODO:
return this.data.push(item);
}
/** スタックから要素を取得する
*
* @param {Number} item
* @return {Number}
*/
pop() {
// TODO:
return this.data.pop();
}
/** スタックの末尾の要素を参照する
*
* @param {Number} item
* @return {Number}
*/
peek() {
// TODO:
const length = this.data.length;
return this.data[length - 1];
}
}
/**
* キューの実装
*
* キューの実装を理解して、要素の追加、取り出しのメソッドをそれぞれ実装しましょう。
* https://qiita.com/drken/items/6a95b57d2e374a3d3292
*
* TODO: のついているメソッドを実際に実装してください
*
*/
class Queue {
data = [];
/** キューの長さを返す
*
* @return {Number}
*/
get size() {
return this.data.length;
}
/** キューに要素を追加する
*
* @param {Number} item
* @return {Number}
*/
enqueue(item) {
// TODO:
return this.data.push(item);
}
/** キューから要素を取得する
*
* @return {Number}
*/
dequeue() {
// TODO:
return this.data.shift();
}
/** キューの要素を参照する
*
* @return {Number}
*/
peek() {
// TODO:
return this.data[0];
}
}
module.exports = {
List,
Stack,
Queue,
};