# 소스
import java.io.*;
class Stack{
private int stack[];
int sp = 0;
Stack(){
stack = new int[100];
}
Stack(int size){
stack = new int[size];
}
public void push(int data) {
if(stack.length == sp)
System.out.println("스택이 가득 찼습니다.");
else {
stack[sp++] = data;
}
}
public int pop() {
if(sp == 0) {
System.out.println("스택이 비었습니다.");
return 0;
}
return stack[--sp];
}
public int size() {
return sp;
}
}
public class ch5_8 {
public static void main(String[] args) throws java.io.IOException{
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
Stack s = new Stack(15);
int a = -1;
s.pop();
while(true) {
a = Integer.parseInt(input.readLine());
if(a==0) break;
s.push(a);
}
while(s.size() > 0)
System.out.println(s.pop());
}
}
# 프로그램 설명
1. Stack에 대한 클래스를 정의한다.
- 스택이란 LIFO(후입 선출 – 나중에 들어간 것이 꺼낼 때는 먼저 나옴)으로 데이터를 저장하고 꺼내는 저장 공간이다.
- 배열을 사용하여 stack을 구현하므로 1차원 배열 stack 변수를 private형으로 선언한다.
- 연산이 일어나는 위치를 가리키는 포인터인 스택 포인터 변수 sp를 int형으로 선언하고 0으로 초기화한다. 배열의 첫 번째 인덱스가 0이므로 0부터 시작한다.
- Stack 클래스의 매개변수를 가지지 않는 생성자인 디폴트 생성자 Stack()를 선언한다. 이 생성자는 stack의 크기를 100으로 초기화한다.
- Stack 클래스의 한 개의 매개변수를 갖는 생성자 Stack(int size)를 선언한다. 이 생성자는 int형 매개변수 size를 입력받아 stack의 크기를 size만큼으로 생성한다.
- 데이터를 삽입하는 메소드 void push(int data)를 선언한다. 이 메소드는 int형 매개변수 data를 입력받아 stack 배열에 삽입한다. 데이터를 삽입한 후 다음에 삽입되는 데이터는 그다음 공간에 삽입되어야 하므로 스택 포인터 변수 sp 값을 데이터를 삽입하고 난 후 1을 증가시킨다. stack 배열의 길이가 즉 stack에 삽입된 데이터의 수가 스택의 크기와 동일하면 스택이 가득 찼다는 메시지를 출력하고 아직 스택에 들어갈 공간이 있다면 데이터를 삽입한다. 이 프로그램에서의 스택의 크기는 15이다.
- 데이터를 제거하는 메소드 int pop()을 선언한다. 이 메소드는 stack 배열에서 가장 마지막에 삽입된 데이터를 제거하여 준다. 제거한 후 stack에 있는 데이터의 수가 하나 줄어들었으므로 스택 포인터 변수 sp 값을 1을 감소시킨다. 만약 스택 포인터 변수 sp 값이 0이면, 즉 stack에 아직 데이터가 삽입되지 않은 상태인 경우에 스택이 비어있다는 메시지를 출력하고 이 메소드를 종료한다.
- 스택 포인터 변수 sp 값을 반환해주는 메소드 int size()를 선언한다. 이는 main 문에서 pop() 메소드를 실행할 때 활용된다.
2. main() 문을 선언한다.
- stack에 넣을 데이터를 입력받기 위해서 java.io.* 패키지를 import 하고 IOException(input, ouput에 대한 예외)이 발생할 수 있다는 것을 명시한다.
- 입력을 받기 위해 BufferedReader 객체 input을 선언한다.
- Stack 클래스 객체 s를 선언하고 크기를 15로 초기화한다.
- 입력받은 값을 저장할 int형 변수 a를 선언하고 –1로 초기화한다.
- 먼저 stack이 비어있는지 확인하기 위해 s.pop() 메소드를 실행한다. 이때 비어있으면 스택이 비어있다는 메시지가 출력된다.
- while문을 사용하여 0이 들어올 때까지 데이터를 입력받는다. 객체 input에 readLine()으로 입력을 받아 int형으로 변수 a에 저장하고 이를 s.push(a) 메소드를 실행해 스택에 a를 삽입한다. 이때 스택에 더 이상 공간이 없으면 스택이 가득 찼다는 메시지를 출력하고 0이 입력되면 push하지 않고 데이터를 입력받는 작업을 중지한다. 0이라는 데이터는 입력될 수 없다고 가정하고 데이터 입력이 종료되었다는 것을 알리는 역할을 한다.
- 0이 입력되어 데이터 입력이 종료되면 스택 포인터 변수 sp 값을 반환하는 s.size() 메소드를 이용하여 sp 값이 0보다 큰 경우 s.pop() 하여 나중에 들어온 데이터 순으로 제거되어 이를 출력한다.
# 실행 결과
# 실행 결과 설명
'전.java' 카테고리의 다른 글
예외 처리 (0) | 2021.01.28 |
---|---|
>>> 연산자 (0) | 2021.01.28 |
개선된 for 문 (0) | 2021.01.28 |
생산자, 소비자 (환형 큐, 버퍼 크기 2) (0) | 2021.01.27 |
원, 사각형 클래스 (넓이, 둘레 구하기) (0) | 2021.01.27 |