하나의 배열에 2개의 스택을 구현하기

2021. 7. 3. 20:47·자료구조 + 알고리즘

이번에는 다음 문제를 해결해보았다. 

Doit! 자료구조와 함께 배우는 알고리즘 입문 자바편 / 144p

 

 

내가 해결한 모양새는 대충 이렇다.

실행부 말고, Stack을 구현한 클래스 내용만 살짝 올려본다. 

 

1. 변수, 예외, 생성자

//변수
private int max;
private int ptrA;
private int ptrB;
private int[] stk;

//예외
public class EmptyStack3Exception extends RuntimeException {
  public void EmptyStack3Exception() {}
}
public class OverflowStack3Exception extends RuntimeException {
  public void OverflowStack3Exception() {}
}


//생성자
public Stack3(int capacity) {
  max = capacity;
  try {
    stk = new int[max];
    ptrA=0; ptrB=max-1;
  } catch (OutOfMemoryError e) {
    max = 0;
  }
}

 

2. 메소드 - 간단히 팝, 푸쉬, 픽만 해보았다.

public int size() {
	return ptrA+(max-1)-ptrB;
}
public int pushA(int x) throws OverflowStack3Exception {
	if(ptrA>=ptrB) 
		throw new OverflowStack3Exception();
	return stk[ptrA++] = x;
}
public int pushB(int x) throws OverflowStack3Exception{
	if(ptrB<=ptrA)
		throw new OverflowStack3Exception();
	return stk[ptrB--] = x; 
}
public int popA() throws EmptyStack3Exception{
	if(ptrA<=0)
		throw new EmptyStack3Exception();
	return stk[--ptrA];
}
public int popB() throws EmptyStack3Exception{
	if(ptrB>=max-1)
		throw new EmptyStack3Exception();
	return stk[++ptrB];
}
public int peekA() throws EmptyStack3Exception{
	if(ptrA<=0)
		throw new EmptyStack3Exception();
	return stk[ptrA-1];
}
public int peekB() throws EmptyStack3Exception{
	if(ptrB>=max-1)
		throw new EmptyStack3Exception();
return stk[ptrB+1];
}

 

 

 

답안과의 차이점

스택A, B 선택하는 구조의 차이

 

나는 사용자가 값을 push, pop, peek할 때 스택A냐 스택B냐를 선택(입력)받도록 했다. 그래서 메인 메서드에 Scanner를 통해여 A인지 B인지 입력받고, 그 입력조건에 따라 pushA, pushB가 실행되도록 했다.

 

반면 답안에서는 enum인 AorB 타입을 선언하여 그 값이 StackA 혹은 StackB가 되도록 했다. 

public enum AorB {
	StackA, StackB
};

 

그리고 모든 메소드의 인자에 AorB타입 객체가 들어가도록 메소드를 구현했다. 메소드 안에는 switch문에 따라 case1: StackA, case2: StackB를 이용하여 인자에 들어오는 객체가 StackA인지 StackB인지에 따라서 알맞게 기능하도록 구현했다.

// 푸시
public int push(AorB sw, int x) throws OverflowIntStackX2Exception {
  if (ptrA >= ptrB + 1)
    throw new OverflowIntStackX2Exception();
  switch (sw) {
  case StackA:
    stk[ptrA++] = x;
    break;
  case StackB:
    stk[ptrB--] = x;
    break;
  }
  return x;
}

 

public int pop(AorB sw) throws EmptyIntStackX2Exception {
  int x = 0;
  switch (sw) {
  case StackA:
    if (ptrA <= 0) // 스택 A가 비어 있음
      throw new EmptyIntStackX2Exception();
    x = stk[--ptrA];
    break;
  case StackB:
    if (ptrB >= max - 1) // 스택 B가 비어 있음
      throw new EmptyIntStackX2Exception();
    x = stk[++ptrB];
    break;
    }
  return x;
}

이런식으로 말이다. 

 

여기서 새로 배워간 것은, enum의 활용 예시이다. 지금까지 문제를 풀면서 딱히 열거타입을 사용할 생각을 하지 않았다. 이번 답안을 보면서 이렇게 열거타입을 적절히 활용하는 상황을 만나보았다. 

반응형

'자료구조 + 알고리즘' 카테고리의 다른 글

[알고리즘] 하노이의 탑 알고리즘 이해 돕기 | 재귀함수 과정  (6) 2021.07.08
재귀의 제거 | Stack에 잠시 저장해두기 | 재귀의 과정 이해 | 비재귀적 구현해보기  (0) 2021.07.08
[자료구조] 스택, 제네릭 스택 | 제네릭 배열 생성시 유의해야할 점 | 강제형변환  (0) 2021.06.29
이진 검색 - 중복요소의 맨 앞 인덱스 찾아내기 | 반복문의 유연한 사용이 필요하겠다.  (0) 2021.06.28
이진 검색 과정을 출력하는 프로그램 작성하기  (0) 2021.06.28
'자료구조 + 알고리즘' 카테고리의 다른 글
  • [알고리즘] 하노이의 탑 알고리즘 이해 돕기 | 재귀함수 과정
  • 재귀의 제거 | Stack에 잠시 저장해두기 | 재귀의 과정 이해 | 비재귀적 구현해보기
  • [자료구조] 스택, 제네릭 스택 | 제네릭 배열 생성시 유의해야할 점 | 강제형변환
  • 이진 검색 - 중복요소의 맨 앞 인덱스 찾아내기 | 반복문의 유연한 사용이 필요하겠다.
히어로맛쿠키
히어로맛쿠키
  • 히어로맛쿠키
    yeny_lab
    히어로맛쿠키
  • 전체
    오늘
    어제
    • 분류 전체보기 (389)
      • 미분류글 (32)
        • ㅇ (2)
      • JAVA (84)
        • Effective Java (1)
        • Application (21)
      • 컴퓨터구조 & OS (28)
      • 자료구조 + 알고리즘 (43)
      • Database (12)
      • 컴파일러 (10)
      • 수학 (33)
        • 미분방정식 (12)
      • 데이터분석과 머신러닝 (38)
      • 기타 (59)
      • yyeeennyy (25)
  • 공지사항

    • ^o^/♡
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
히어로맛쿠키
하나의 배열에 2개의 스택을 구현하기
상단으로

티스토리툴바