Posts 자료구조&알고리즘 01. Stack
Post
Cancel

자료구조&알고리즘 01. Stack

1. Stack

Stack은 데이터를 저장하는데 사용되는 구조로, 가장 마지막에 넣은 것이 가장 처음으로 나간다.

여러 권의 책을 쌓은 후 아래가 아닌, 위에서부터 한 권씩 빼서 사용하는 것과 같은 원리이다.

LIFO(Last In Firt Out) / FILO(First In Last Out)


Stack은 보통 배열 구조를 활용하여 쉽게 구현 할 수 있다는 장점이 있지만,

이렇게 할 경우 Stack의 크기를 미리 정해주어야 하며, 그만큼 낭비가 발생할 수 있다는 단점이 있다.


1-1. Stack의 기능들

기능설명
push데이터를 스택에 넣는다.
pop데이터를 스택에서 꺼낸다.
peek데이터를 꺼내지 않고 보기만 한다.
clear모든 요소를 삭제한다.
dump 모든 데이터를 보여준다.
isEmpty스택이 비었는지 알려준다.

2-1. 구현해보기 - Python

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
class Stack :
  class Node : # Node 내부에는 값과, 다음 노드가 있다.
    def __init__(self, data) :
      self.data = data
      self.next = None
      
  def __init__(self) : # Stack을 처음 만들었을 때에는 값이 아무것도 있지 않다.
    self.last = None
  
  def push(self, data) : # Stack에 값을 넣어주는 push
    self.node = Node(data) # 노드를 생성해서 값을 넣어준다.
    self.node.next = self.last # 노드의 다음 노드는 이전에 상단에 있던 Node가 온다.
    self.last = self.node # 새로 생성된 노드가 위로 올라간다.

  def pop(self) : # Stack에서 값을 빼서 보여주는 pop
    if (self.last == None) : # 만약 Stack에 아무것도 없다면 None을 반환한다.
      return None
    result = self.last.data # 가장 마지막 데이터를 보여준다.
    self.last = self.last.next # 마지막 데이터가 빠졌으니 이전 노드가 상단으로 와야한다.
    return result

  def peek(self) :
    if (self.last == None) : # 만약 Stack에 아무것도 없다면 None을 반환한다.
      return None
    return self.last.data # 가장 마지막의 데이터를 보여준다.
    
  def isEmpty(self) : # Stack이 비었는지 알려주는 isEmpty
    return self.last == None
    
  def clear(self) : # Stack을 비워주는 clear
    self.last = None

2-2. 구현해보기 - Java

Java로는 기본 기능인 push, pop, peek만 구현했습니다.

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
import java.util.NoSuchElementException;

class Stack<T> {
  // 하나의 노드에는 하나의 값과 다음 노드가 담겨있다.
  class Node<T> {
    private T data;
    private Node<T> next;
    public Node(T data) {
      this.data = data
    }
  }
  
  // 가장 위의 데이터가 담긴 노드
  private Node<T> last;
  
  // 스택에 값을 넣는 push 스텍
  public push(T data) {
    // 노드를 생성하여 값을 넣고
    Node<T> node = new Node<T>(data);
    // 이전에 있던 가장 위의 노드를 새로운 노드의 다음으로 설정해 준다.
    node.next = last;
    // 가장 위의 노드를 새로운 노드로 설정해 준다.
    last = node;
  }
  
  // 스택에서 값을 빼는 pop
  public T pop() {
    // 만약 스택에 값이 아무것도 없다면 예외처리
    if (last == null) {
      throw new NoSuchElementException("pop 실패. 데이터가 없습니다.");
    }
    T result = last.data;
    last = last.next;
    return result;
  }
  
  // 스택에서 마지막 값을 보여주는 peek
  public T peek() {
    // 만약 스택에 값이 아무것도 없다면 예외처리
    if (last == null) {
      throw new NoSuchElementException("pop 실패. 데이터가 없습니다.");
    }
    return last.data;
  }
}

참고로 Java에는 java.util.Stack 클래스가 존재한다.

대신 Stack 클래스에서는 값을 넣는 메소드가 add() 이고, 아래와 같이 사용한다.

>import java.util.Stack; public class Main{ public static void main(String[] args){ Stack<Integer> stack = new Stack<Integer>(); stack.add(1); stack.pop(); // 1 } }
This post is licensed under CC BY 4.0 by the author.

Network 01. Web과 WAS?

자료구조&알고리즘 02. Queue