01. Stack / Queue 배열 구조로 구현하기
Stack : LIFO
- Enqueue: 스택 상단에 요소를 추가합니다.
- Dequeue: 스택에서 맨 위 요소를 제거합니다.
- Peek: 스택의 최상위 요소를 제거하지 않고 어떤 값인지 봅니다.
- IsEmpty: 스택이 비어 있는지 확인합니다.
// Stack
const stack = [];
stack.push("Apple"); // Enqueue [ Apple ]
stack.push("Banana"); // Enqueue [ Apple, Banana ]
stack.push("Orange"); // Enqueue [ Apple, Banana, Orange ]
stack.pop(); // Dequeue -> Orange 제거
// [ Apple, Banana ]
stack[stack.length-1]; // Peek -> Banana
const isEmpty = () => {
return stack.length == 0; // false
}
Queue : FIFO
- Enqueue: 큐 뒤쪽에 요소를 추가합니다.
- Dequeue: 큐에서 맨 앞의 요소를 제거합니다.
- Peek: 큐의 맨 앞 요소를 제거하지 않고 어떤 값인지 봅니다.
- IsEmpty: 큐가 비어 있는지 확인합니다.
// Queue
const queue = [];
queue.push("Apple"); // Enqueue [ Apple ]
queue.push("Banana"); // Enqueue [ Apple, Banana ]
queue.push("Orange"); // Enqueue [ Apple, Banana, Orange ]
queue.shift(); // Dequeue -> Apple
// [ Banana, Oragne ]
queue[0]; // Peek -> Banana
const isEmpty = () => {
return queue.length == 0; // false
}
02. linked list를 Class로 구현하기
- append : 리스트 가장 뒤에 값을 추가합니다.
- prepend : 리스트 가장 앞에 값을 추가합니다.
- delete : 원하는 값을 삭제합니다.
- delete_first : 리스트 가장 앞에 있는 값을 삭제합니다.
- delete_last : 리스트 가장 뒤에 있는 값을 삭제합니다.
- display : 리스트를 출력합니다.
class Node {
constructor(data, next = null) {
this.data = data;
this.next = next;
// 초기 값을 null로 해준 이유는 꼬리 tail부분에 있는 자료는 가르킴을 받는 자료가 뒤에 없기 때문
}// constructor
}// Node
class LinkedList {
constructor() {
this.head = null; // 처음에 데이터가 없다면 head는 null이다.
this.size = 0;
}// constructor
//append
insertBack(data) {
let newNode = new Node(data);
let current;
if (!this.head) {
this.head = newNode;
return
}
current = this.head;
while (current.next) {
current = current.next;
}
current.next = newNode;
this.size++;
}//insertBack
//prepend
insertFirst(data) {
this.head = new Node(data, this.head);
this.size++;
}//insertFirst
//delete
deleteData(data) {
let currentNode = this.head;
if (currentNode && currentNode.data == data) {
this.head = currentNode.next;
currentNode = null;
return
}
let prevNode = null;
while (currentNode && currentNode.data != data ) {
prevNode = currentNode;
currentNode = currentNode.next;
}
if (!currentNode) { return }
prevNode.next = currentNode.next;
currentNode = null;
this.size--;
}// deleteData
deleteFirst() {
if (this.head) {
this.head = this.head.next;
}
this.size--;
}//deleteFirst
deleteLast() {
if (!this.head) { return }
if (!this.head.next) { this.head = null; return }
let seconedLast = this.head;
while (seconedLast.next.next) {
seconedLast = seconedLast.next;
}
seconedLast.next = null;
this.size--;
}//deleteLast
display() {
let currentNode = this.head;
let viewDataStructure = '';
while (currentNode) {
viewDataStructure += `${currentNode.data}->`;
currentNode = currentNode.next;
}
console.log(viewDataStructure + "end");
}//display
}// LinkedList
const linkedSample = new LinkedList();
linkedSample.insertFirst(1);
linkedSample.insertFirst(2);
linkedSample.insertFirst(3);
linkedSample.insertBack(9);
linkedSample.display(); // 출력 : 3->2->1->9->end
linkedSample.deleteData(2);
linkedSample.display(); // 출력 : 3->1->9->end
linkedSample.deleteFirst();
linkedSample.display(); // 출력 : 1->9->end
linkedSample.deleteLast();
linkedSample.display(); // 출력 : 1->end
'Data Structure&Algorithm' 카테고리의 다른 글
[Algorithm] 그리디 (1) | 2024.04.12 |
---|---|
[Algorithm] 에라토스테네스의 체 (0) | 2024.04.04 |
[Data Structure] Hash Table, Deque, 투포인터 (2) | 2024.04.03 |
[Algorithm] 후위표현식? stack? (0) | 2024.03.26 |
[Data Structure] 기초 상식 / 문자열 / 기초 수학 (0) | 2024.03.19 |