학습장/Algorithm

1. 2. 1. Stack 구현해보기 Coding

Shin Jaehyun 2018. 4. 20. 19:58
순서도를 먼저 그리고 하는편이 그래도 더 수월했습니다. 뭘 할지 알고 타이핑을 해야하는지라..

2018년 1회 정보처리기사 실기 알고리즘의 마지막 문제였던 Stack 구현하기입니다. 

하면서 C에서 출력하는 양식을 책에서는 그냥 훑어만 봤었는데, 조금조금 건드려보기도 하고, 
실제로 동작시키면서 조금씩 조금씩 수정도 했습니다. 

그래도 꽤 깔끔하게 나왔어요. 주석을 여기저기 달게되긴 했습니다만.^^


package algorithm_test;
import java.util.Scanner;
public class StackMimic { // stack을 따라가보자.
     static final int Max = 5; // 전역변수들 먼저 선언하고 가자.
     static int[] Stack = new int[Max]; // Max가 5니까, 5개의 자료가 들어가는 1차원 배열
     static int Top = -1; // Top++; 하고 시작할거니까, 시작하는 수는 첫번째 자리 0 에 들어갈 수 있도록
     public static void main(String[] args) {
           int order, msg, nData; // 실행명령어, 함수들에 보낼 message, 숫자.
           Scanner scan = new Scanner(System.in); // C와 다른듯.. 하지만, Scanner를 만들고, while로 받아내면 된다.
           while (true) {
                System.out.println("명령을 입력하세요. 1:삽입 2:삭제 3:종료");
                order = scan.nextInt();
                if (order == 1) {
                     System.out.println("입력하실 숫자를 입력하세요.");
                     nData = scan.nextInt();
                     msg = push(nData);
                     if (msg == -1) // return 값이 -1인경우, 반복문 종료
                           break;
                } else if (order == 2) {
                     msg = pop();
                     if (msg == -1) // return 값이 -1인경우, 반복문 종료
                           break;
                     else
                           System.out.printf("제거한 자료는 %d 입니다.\n", msg);
                } else
                     break;
           } // while
           if (Top < 0)
                System.out.print("출력할 자료가 없습니다. 종료됩니다.");
           else {
                System.out.println("Stack에 저장되어있던 자료는 ");
                for (int i = Top; i >= 0; i--) {
                     System.out.printf("%10d \n", Stack[i]); // 책에서 봤던 c의 출력방식을 따라가고 있어요. 공부를 해봐야겠습니다.
                }
                System.out.println("입니다.");
                scan.close();
           }
     }
     static int push(int n) { // 함수들은 어쨌든 결과가 완료되면 -1을 main 함수로 보내서 while 문을 빠져나오도록 할거니까, 반환형 int를 주고..
           Top++;
           if (Top > Max - 1) { // Top이 4보다 큰 경우. 배열은 0, 1, 2, 3, 4고, Max는 5였으니까.
                System.out.println("Stack Overflow!");
                Top--;
                return -1;
           } else {
                Stack[Top] = n; // push에 들어오는 숫자가 그대로 쓰이지만, main에서 넣었던 nData가 들어오는 것.
                return 0;
           }
     }// method push 종료
     static int pop() {
           int rmv; // remove할거에요.
           if (Top <= -1) {
                System.out.println("Stack Underflow!");
                return -1;
           }
           rmv = Stack[Top];
           Top--;
           return rmv; // rmv된 숫자를 보내겠죠
     }// method pop 종료
}


결과를 실험해보았습니다. 


꼼꼼하게 본다고 보고, 하다가 C에서 출력하는 방식도 조금조금 보고... pointer라는 개념도 은근히 공부를 해야할 것 같아서, 살펴보는김에 중간중간 출력을 저렇게 했습니다. 

종이자격증이 아니게 될 때까지, 계속 연습해보려고요. 

다음엔 2018년 실기시험의 마지막 남은 Java 1차원 배열에서 순서를 정렬하는걸 해볼겁니다. 하는건 그렇게 어렵지 않은데, 기출문제중에 버블정렬을 왼쪽에서 오른쪽으로, 오른쪽에서 왼쪽으로 진행하는 문제가 순서도로 나온적이 있었어요. 애초에 기본적인 문제기도 하지만, 2018년 문제들 마무리가 되면, 처음부터 끝까지 다 해보려고 생각중입니다. 

좋은 주말 되세요.^^