ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] Stack 스택 구현/ Stack class 사용법
    아가개발자/자료구조,알고리즘 2021. 7. 28. 14:36

    자료구조를 배울 때 가장 처음 배우게 되는 "Stack"에 대해 알아보고 직접 구현, 그리고 제공되는 클래스를 통해 스택을 사용하는 방법을 알아보도록 하겠습니다. 

     

    스택(Stack) 

    스택(Stack) 자료구조의 하나로 한 쪽 끝에서만 자료를 삽입/삭제가 가능한 "LIFO(Last In First Out )" 구조입니다. 

    따라서, 스택은 접근하기에 제한적이라는 단점이 존재합니다. 

     

    연산의 종류
    • Push: 스택에 자료를 넣는 연산
    • Pop: 스택에서 자료를 빼는 연산 (가장 나중에 들어왔던 자료가 삭제 됨)
    • Top: 스택의 가장 위에 있는 자료를 반환하는 연산 (가장 나중에 들어온 자료)
    • Empty: 스택이 비어있는지 확인하는 연산
    • Size: 스택에 저장된 자료의 개수를 반환하는 연산 

     

    스택 직접 구현 (JAVA) 
    • Main class에 스택과 size 선언 
        public static int[] stack = null; 
        public static int size=0;

     

    • Stack에 사용될 함수 구현 
        public static int empty(){
            if(size == 0){return 1;}
            else {return 0;}
        }
    
        public static void push(int X){
            stack[size] = X;
            size++; 
        }
        public static int pop(){
            if(empty()==1){return -1;}
            else {
                size--;
                return stack[size];
            }
        }
        public static int top(){
            if(empty() ==1){return -1;}
            else{
                return stack[size-1];
            }
        }

     

    • 스택 사용 (Main)
    public static void main(String[] args) throws IOException{ 
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
            
            int N = Integer.parseInt(br.readLine()); 
            stack = new int[N];
            
            while (N-- >0){
                StringTokenizer st = new StringTokenizer(br.readLine(), " ");
                String inst = st.nextToken();
                
                switch(inst){
                    case "push": 
                        push(Integer.parseInt(st.nextToken()));
                        break;
                    case "pop":
                        bw.write(String.valueOf(pop()) + "\n"); 
                        break;
                    case "size":
                        bw.write(String.valueOf(size) + "\n"); 
                        break;
                    case "top":
                        bw.write(String.valueOf(top()) + "\n");
                        break;
                    case "empty":
                        bw.write(String.valueOf(empty()) + "\n");
                        break;
                }
            }
            bw.flush();
            bw.close();
        }

    메인 함수에서 직접 구현한 함수들이 switch 문 안에서 실행되도록 구현하였고,

    실행 시간을 줄이기 위해 BufferReader, BufferWriter로 입출력하였습니다. 

     

    JAVA Stack 클래스 사용 

    스택을 사용하고자 할 때 항상 일일이 위의 코드를 작성하면 시간이 오래걸리고 귀찮겠죠 ! 

    이러한 번거로움을 줄이고 성능을 높이기 위해 제공되는 클래스를 사용하는 방법을 익혀두셔야 합니다.

    물론 stack을 정확히 이해했다면 위의 코드는 직접 짤 수 있어야 합니다!!

     

    stack class를 제대로 사용하기 위해서 공식문서를 참고해봅시다.

    https://docs.oracle.com/javase/10/docs/api/java/util/Stack.html

     

    Stack (Java SE 10 & JDK 10 )

     

    docs.oracle.com

     

    • java.util.Stack<E>

    stack을 사용하기 위해 패키지를 불러오는 과정입니다. 

    import java.util.Stack;

     

    • Stack<자료형> <스택 명> = new Stack<>();  // 스택 선언

    사용할 스택과 스택에 들어갈 자료형과 함께 선언해줍니다. 

    Stack<String> Stack = new Stack<>();

     

    • 스택 연산 

    위에서 설명하였던 연산들을 사용할 수 있습니다.

    Stack<Integaer> stack = new Stack<>();
    
    stack.push(3); //stack에 3을 삽입
    stack.empty(); // stack이 비어있으면 true, 비어있지 않으면 false를 반환 
    stack.pop() // stack에 가장 위에 있는 값을 삭제
    stack.peek() // stack에 가장 위에 있는 값을 반환
    stack.search(3) // stack에서 3을 찾는 명령어 --> 있으면 위치 반환, 없으면 -1을 반환

     

    댓글

Designed by Tistory.