

class Stack {
constructor() {
this.items = [];
}
push(element) {
this.items.push(element);
}
pop() {
if (this.isEmpty()) {
return "Underflow";
}
return this.items.pop();
}
isEmpty() {
return this.items.length === 0;
}
size() {
return this.items.length;
}
peek() {
if (this.isEmpty()) {
return "Stack is empty";
}
return this.items[this.items.length - 1];
}
clear() {
this.items = [];
}
}
let stack = new Stack();
stack.push(1);
stack.push(2);
stack.push(3);
console.log("Top element: ", stack.peek()); // 3
console.log("Stack size: ", stack.size()); // 3
console.log("Popped element: ", stack.pop()); // 3
console.log("Stack after pop: ", stack.items); // [1, 2]
스택 자료구조의 기본 연산인 삽입과 삭제의 시간복잡도는 O(1)이다. 새로운 요소를 스택에 추가하는 연산은 배열의 맨 끝에 요소로 추가하면 되고, 제거하는 연산도 배열의 맨 끝에서 직접 제거할 수 있다. 하지만 특정 데이터를 탐색할 때에는 찾을 때까지 수행 해야하므로 O(n)의 시간복잡도를 가진다.

class Queue {
constructor() {
this.items = [];
}
enqueue(element) {
this.items.push(element);
}
dequeue() {
if (this.isEmpty()) {
return "Underflow";
}
return this.items.shift();
}
isEmpty() {
return this.items.length === 0;
}
size() {
return this.items.length;
}
peek() {
if (this.isEmpty()) {
return "Queue is empty";
}
return this.items[0];
}
clear() {
this.items = [];
}
}
let queue = new Queue();
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
console.log("Front element: ", queue.peek()); // 1
console.log("Queue size: ", queue.size()); // 3
console.log("Dequeued element: ", queue.dequeue()); // 1
console.log("Queue after dequeue: ", queue.items); // [2, 3]
push 메서드를 사용하여 요소를 추가하고, dequeue 메서드는 배열의 shift 메서드를 사용하여 가장 앞에 있는 요소를 제거한다.큐 자료구조의 기본 연산인 삽입과 삭제의 시간복잡도는 O(1)이다. 새로운 요소를 큐의 뒤에 추가하는 연산은 배열의 끝에 요소를 추가하고 큐의 앞에 요소를 제거하는 연산은 배열의 처음에 요소를 제거한다.