import java.util.Scanner;
interface Stackable {
public boolean isEmpty();
public boolean isFull();
public void push(char item);
public char pop();
public char peek();
public void clear();
}
class Stack implements Stackable {
public int top;
public int stackSize;
public char stackArr[];
// 스택을 생성한다.
public Stack(int stackSize) {
top = -1; // 스택 포인터 초기화
this.stackSize = stackSize; // 스택 사이즈 설정
stackArr = new char[this.stackSize]; // 스택 배열 생성
}
@Override
public boolean isEmpty() {
if (this.top == -1) {
return true;
}
return false;
}
@Override
public boolean isFull() { // 1을 빼준 이유는 인덱스 특성때문에.
if (this.top == (this.stackSize - 1)) {
return true;
}
return false;
}
@Override
public void push(char item) {
if (isFull()) {
System.out.println("스택이 이미 가득 찼어요");
} else {
stackArr[++top] = item;
System.out.println("입력된 문자: " + item);
}
}
@Override
public char pop() {
if (isEmpty()) {
System.out.println("스택은 이미 비어있어요");
return 0;
} else {
System.out.println("삭제된 문자: " + stackArr[top]);
return stackArr[top--]; // 포인터 이동?
}
}
@Override
public char peek() {
if (isEmpty()) {
System.out.println("스택은 이미 비어있어요");
return 0;
} else {
System.out.println("엿볼려는 문자: " + stackArr[top]);
return stackArr[top];
}
}
@Override
public void clear() { //
if (isEmpty()) {
System.out.println("이미 비어있습니다.");
} else {
for (int i = top; i > -1; i--) {
stackArr[i] = 0;
}
top = -1;
System.out.println("스택이 초기화 됐습니다.");
// stackArr = new char[this.stackSize];
// 스택 배열 다시생성하는 것보다 배열 안의 값을 초기화하고 값을 다시 채울 수 있게 포인터만 변경하는 방법으로 채택
}
}
// 스택에 저장된 모든 데이터를 출력
public void printStack() {
if (isEmpty()) {
System.out.println("스택에 아무것도 없어요!");
} else {
System.out.print("Stack elements : ");
for (int i = 0; i <= top; i++) {
System.out.print(stackArr[i] + " ");
}
System.out.println();
}
}
}
public class StackTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("스택 사이즈를 입력하시오.");
int stackSize = sc.nextInt();
Stack stack = new Stack(stackSize);
stack.push('A');
stack.printStack();
stack.push('B');
stack.printStack();
stack.push('C');
stack.printStack();
stack.pop();
stack.printStack();
stack.pop();
stack.printStack();
stack.peek();
stack.printStack();
stack.clear();
stack.printStack();
}
}
🔽 에러 뜬 부분의 코드
@Override
public boolean isFull() {
if (this.top == ( stackArr.length - 1)) { return true; }
return false;
}
public Stack(int stackSize) {
top = -1; // 스택 포인터 초기화
this.stackSize = stackSize; // 스택 사이즈 설정
stackArr = new char[this.stackSize]; // 스택 배열 생성
}
@Override
public boolean isFull() {
if (this.top == ( stackArr.length - 1)) { return true; }
return false;
}
알고보니, 4번째 줄의 배열 생성이 빠져 있어서 난 오류였다. 결국 배열을 생성하지도 않아놓고 배열의 참조변수인 stackArr
을 이용해 stackArr.length
을 코딩해 벌어진 참사였다.
🔽 코드
public void printStack() {
if (isEmpty()) {
System.out.println("스택에 아무것도 없어요!");
}
System.out.print("Stack elements : ");
for (int i = 0; i <= top; i++) {
System.out.print(stackArr[i] + " ");
}
System.out.println();
}
return
을 사용하거나, 반복문 안에서 break
continue
를 사용할 때 else 의 생략이 가능하다. printStack함수는 void형으로 정하고 만들었음으로, retrun을 사용할 수는 없으니 else를 꼭 넣어주어야 한다.@Override
public char pop() {
if (isEmpty()) {
System.out.println("스택은 이미 비어있어요");
return 0; // 스택은 이미 비어있으니 할게 없어 프로그램 종료.
} else {
System.out.println("삭제된 문자: " + stackArr[top]);
return stackArr[top--]; // 포인터 이동?
}
}
🔽 수정 후 정상코드
public void printStack() {
if (isEmpty()) {
System.out.println("스택에 아무것도 없어요!");
} else {
System.out.print("Stack elements : ");
for (int i = 0; i <= top; i++) {
System.out.print(stackArr[i] + " ");
}
System.out.println();
}
}