레커
[TIL] Stack / Queue / linkedlist 구현 본문
Stack
Last In First Out 나중에 들어온 자료를 먼저 처리하는 형태
class Stack {
constructor() {
this.arr = [];
this.index = 0;
}
push(value) {
this.arr[this.index] = value;
this.index++;
}
pop() {
if (this.index <= 0) return null;
this.index--;
const result = this.arr[this.index];
return result;
}
}
let stack = new Stack();
stack.push(1);
stack.push(2);
stack.push(3);
console.log(stack.pop());
console.log(stack.pop());
console.log(stack.pop());
console.log(stack.pop());
Queue
First In First Out 먼저 들어온 데이터가 먼저 나가는 형태
class Queue {
constructor() {
this.arr = [];
this.index = 0;
}
push(value) {
this.arr[this.index] = value;
this.index++;
}
pop() {
this.arr.splice(0, 1);
}
front() {
return this.arr[0];
}
}
let queue = new Queue();
queue.push(1);
queue.push(2);
queue.push(3);
console.log(queue.front());
queue.pop();
console.log(queue.front());
linkedlist
- 유동적으로 연결고리를 떼었다가 붙였다가 할 수 있는 자료구조
- 링크드 리스트 요소의 삽입/삭제에 강점이 있다.
- 빈번하게 데이터를 삽입/삭제 해야하는 경우에 사용하면 좋다.
class Node {
constructor(data) {
this.data = data;
this.link = null;
}
}
class LinkedList {
constructor(data) {
this.head = new Node(data);
}
append_Last(val) {
let last = new Node(val);
if (this.head == null) {
this.head = temp;
} else {
let temp = this.head;
while (temp.link != null) {
temp = temp.link;
}
temp.link = last;
}
}
append_First(val) {
let first = new Node(val);
if (this.head == null) {
this.head = first;
} else {
let temp = this.head;
this.head = first;
this.head.link = temp;
}
}
append_Insert(node, val) {
let currentLink = this.head;
let nextLink = null;
while (currentLink != node) {
if (currentLink == null) {
break;
}
currentLink = currentLink.link;
}
if (currentLink == null) {
//일치하는 값 없음
this.append_Last(val);
} else {
nextLink = currentLink.link;
currentLink.link = new Node(val);
currentLink.link.link = nextLink;
}
}
delete(node) {
let currentLink = this.head;
let preLink = this.head;
while (currentLink != node) {
if (currentLink == null) {
break;
}
preLink = currentLink;
currentLink = currentLink.link;
}
if (currentLink == null) {
} else {
preLink.link = currentLink.link;
}
}
get_NodeOne(node) {
let currNode = this.head;
while (currNode != node) {
if (currNode == null) {
break;
}
currNode = currNode.link;
}
if (currNode == null) {
console.log("일치값이 없음");
}
return currNode;
}
get_All() {
let temp = this.head;
let result = [];
while (true) {
result.push(temp.data);
if (temp.link == null) {
break;
}
temp = temp.link;
}
return result;
}
}
let test = new LinkedList(20);
test.append_Last(60);
test.append_Last(40);
test.append_Last(50);
console.log(test.get_All());
test.append_Insert(test.head.link, 30);
console.log(test.get_All());
test.delete(test.head.link);
console.log(test.get_All());
test.append_First(10);
console.log(test.get_All());