스택

전.java / / 2021. 1. 27. 19:50
728x90

# 소스

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
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기