스택은 접시 더미처럼 작동하는 간단한 선형 데이터 구조입니다 ?️. 이는 후입선출(LIFO) 원칙을 따릅니다. 접시 더미라고 생각하세요. 더미 꼭대기에서만 접시를 추가하거나 제거할 수 있습니다.
스택에 대한 더 나은 이해를 위해 짧은 상상의 여행을 떠나볼까요?.
당신이 멋진 레스토랑에 있다고 상상해 보세요 ?️, 주방 직원이 바쁜 밤을 준비하고 있나요 ??. 접시 공간에는 사용을 기다리는 접시가 높이 쌓여 있습니다. 손님이 도착하고 주문이 쏟아져 들어오면 직원이 접시 더미 위에서 접시를 가져옵니다. 깨끗한 접시를 추가하면 바로 위에 올려집니다. 이 간단한 시스템을 사용하면 더미 아래에 있는 가장 오래 보관된 접시를 마지막에 사용하고, 갓 청소한 맨 위의 접시를 먼저 사용하게 됩니다 ✨.
이것은 본질적으로 스택 데이터 구조가 작동하는 방식입니다. 스택은 LIFO(Last In First Out) 원칙을 따르는 선형 데이터 구조입니다. 접시 더미와 마찬가지로 스택에 마지막으로 추가된 항목이 가장 먼저 제거됩니다.
스택 데이터 구조에 대한 이 포괄적인 튜토리얼에서는 간단하고 초보자 친화적인 접근 방식으로 다음 주제를 살펴보겠습니다.
준비됐나요? 자세히 살펴보겠습니다
스택은 LIFO(후입선출) 원칙을 따르는 선형 데이터 구조입니다. 즉, 스택에 마지막으로 추가된 요소가 가장 먼저 제거됩니다. 책 더미처럼 생각하세요. 책 더미 상단에서만 책을 추가하거나 제거할 수 있습니다.
흐름을 계속 진행하고 코드를 작성하기 전에 스택을 사용하지 말아야 할 위치와 위치를 이해하는 것이 좋습니다. 아래 표에는 스택의 장점과 단점이 자세히 나와 있습니다.
장점 | 단점 |
---|---|
간단하고 구현하기 쉬움 | 제한된 액세스(최상위 요소에만 직접 액세스 가능) |
후입선출(LIFO) 작업에 효율적입니다. | 요소의 무작위 액세스에 적합하지 않음 |
푸시 및 팝 작업을 위한 상수 시간 O(1) | 제대로 관리하지 않으면 스택 오버플로가 발생할 수 있습니다. |
알고리즘에서 상태를 추적하는 데 유용합니다(예: 깊이 우선 검색) | 임의 요소를 검색하거나 액세스하는 데 적합하지 않음 |
메모리 관리에 도움이 됩니다(예: 프로그래밍 언어의 호출 스택) | 일부 구현에서 크기가 고정되었습니다(배열 기반 스택) |
데이터 반전에 유용함 | 동적 구현에서는 크기 조정이 필요할 수 있으며, 이는 비용이 많이 들 수 있습니다. |
재귀 알고리즘을 자연스럽게 지원합니다. | 잦은 순회가 필요한 대규모 데이터 세트에는 효율적이지 않습니다. |
식 평가 및 구문 분석에 도움이 됩니다. | 빈 스택에서 팝 작업을 호출할 경우 언더플로 가능성이 있습니다. |
소프트웨어의 실행 취소 메커니즘에 유용합니다. | 더 복잡한 데이터 구조에 비해 제한된 기능 |
특정 유형의 데이터 구성에 효율적입니다(예: 브라우저 기록) | 큐와 유사한(FIFO) 동작이 필요한 문제에는 적합하지 않습니다. |
스택에서 수행할 수 있는 기본 작업은 다음과 같습니다.
스택은 컴퓨터 과학 및 소프트웨어 개발의 모든 곳에 있습니다. 다음은 몇 가지 일반적인 응용 프로그램입니다.
실행 취소 기능: 텍스트 편집기나 그래픽 디자인 소프트웨어에서는 각 작업이 스택에 푸시됩니다. "실행 취소"를 누르면 가장 최근 작업이 스택에서 제거되고 취소됩니다.
브라우저 기록: 새 페이지를 방문하면 스택에 푸시됩니다. "뒤로" 버튼을 누르면 스택에서 현재 페이지가 팝업되어 이전 페이지가 표시됩니다.
함수 호출 스택: 프로그래밍 언어에서 함수 호출은 스택을 사용하여 관리됩니다. 함수가 호출되면 호출 스택으로 푸시됩니다. 돌아오면 튀어나옵니다.
표현식 평가: 스택은 산술 표현식, 특히 후위 표기법의 표현식을 평가하는 데 사용됩니다.
역추적 알고리즘: 미로 해결 또는 퍼즐 해결과 같은 문제에서 스택은 이동한 경로를 추적할 수 있으므로 필요할 때 쉽게 역추적할 수 있습니다.
이제 JavaScript로 스택을 구현해 보겠습니다. JavaScript에서 스택을 구현하는 다양한 방법이 있다는 것을 아는 것이 중요합니다. 스택을 구현하는 일반적인 방법 중 하나는 배열을 사용하는 것이고, 또 다른 방법은 연결 목록을 사용하는 것입니다. 이번 글에서는 연결리스트(Single Linked List)를 이용하여 스택을 구현해보겠습니다.
연결된 목록이 어떻게 작동하는지 아직도 기억하시나요? 동일한 시리즈의 이전 기사 중 하나에서 연결 목록 구현을 확인해야 할 수도 있습니다.
이제 단일 연결 목록을 사용하여 스택 구현을 시작하겠습니다. 우리 갈까?
먼저 스택 개별 항목을 나타내는 노드 클래스를 만듭니다.
class Node { constructor(data) { this.data = data; this.next = null; } }
그런 다음 스택을 나타내는 Stack 클래스를 생성하겠습니다.
class Stack { constructor() { this.top = null; this.size = 0; } // Stack Operations will be implemented here ? }
푸시 작업은 스택 상단에 새 요소를 추가합니다. 새 StackNode를 생성하고 다음 포인터를 현재 상단으로 설정한 다음 이 새 노드를 가리키도록 상단을 업데이트합니다. 마지막으로 크기가 증가합니다.
// Push element to the top of the stack push(element) { const newNode = new Node(element); newNode.next = this.top; this.top = newNode; this.size ; }
팝 작업은 스택의 최상위 요소를 제거합니다. 먼저 스택이 비어 있는지 확인합니다. 그렇다면 오류 메시지를 반환합니다. 그렇지 않으면 상단 요소를 제거하고 상단 포인터를 다음 노드로 업데이트하고 크기를 줄입니다. 마지막으로 제거된 요소를 반환합니다.
// Remove and return the top element pop() { if (this.isEmpty()) { return "Stack is empty"; } const poppedElement = this.top.data; this.top = this.top.next; this.size--; return poppedElement; }
Peek 작업은 최상위 요소를 제거하지 않고 반환합니다. 먼저 스택이 비어 있는지 확인합니다. 그렇다면 오류 메시지를 반환합니다. 그렇지 않으면 최상위 요소의 데이터를 반환합니다.
// Return the top element without removing it peek() { if (this.isEmpty()) { return "Stack is empty"; } return this.top.data; }
isEmpty 작업은 스택이 비어 있는지 확인합니다. 스택이 비어 있으면 true를 반환하고 그렇지 않으면 false를 반환합니다.
// Check if the stack is empty isEmpty() { return this.size === 0; }
getSize 작업은 스택 크기를 반환합니다. 스택의 요소 수를 반환합니다.
// Return the size of the stack getSize() { return this.size; }
인쇄 작업은 스택을 인쇄합니다. 최상위 요소의 데이터를 반환합니다.
// Print the stack print() { let current = this.top; let result = ""; while (current) { result = current.data " "; current = current.next; } console.log(result.trim()); }
// Usage example const customStack = new CustomStack(); customStack.push(10); customStack.push(20); customStack.push(30); console.log(customStack.pop()); // 30 console.log(customStack.peek()); // 20 console.log(customStack.getSize()); // 2 console.log(customStack.isEmpty()); // false customStack.print(); // 20 10
이 구현에서는 연결된 목록(단일 연결 목록) 구조를 사용하여 스택을 나타냈습니다. 각 요소는 데이터 값과 다음 노드에 대한 참조가 있는 노드입니다. 스택의 맨 위는 항상 가장 최근에 추가된 노드입니다.
스택은 LIFO(후입선출) 원칙을 따르는 컴퓨터 과학의 기본 데이터 구조입니다. 함수 호출 관리, 실행 취소 기능 구현, 산술 표현식 평가 등 다양한 애플리케이션에 사용됩니다.
이 튜토리얼에서는 스택의 기본 사항, 스택 사용의 장단점, JavaScript에서의 구현(연결된 목록 사용)을 다루었습니다. 스택을 이해하는 것은 스택을 구현하는 방법을 아는 것뿐만 아니라 스택이 문제 해결을 위한 올바른 도구인지 인식하는 것이기도 합니다.
소프트웨어 개발 여정을 계속하다 보면 스택이 문제 해결 툴킷에서 없어서는 안 될 도구라는 것을 알게 될 것입니다. 단순하면서도 강력하며, 이를 익히면 효율적인 알고리즘과 데이터 구조를 설계하는 능력이 크게 향상됩니다.
이 시리즈의 모든 부분을 놓치지 않도록 하고 소프트웨어 개발(웹, 서버, 모바일 또는 스크래핑/자동화), 데이터 구조 및 알고리즘 및 기타 흥미로운 기술에 대한 더 심층적인 토론을 위해 나와 연결하기 위해 주제에 대해 저를 팔로우하세요:
계속 지켜봐 주시기 바랍니다. 즐거운 코딩 되세요 ???
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3