본문 바로가기

플밍 is 뭔들/자료구조

03-2 스택의 구현(순차 자료구조)

※ 스택의 구현
  1. 순차 자료구조를 이용한 방식
  2. 연결 자료구조를 이용한 방식

※ 순차 자료구조를 통한 구현
  1. 차원 배열 stack[n]을 사용할 때 n이 스택의 크기가 되며 top이 n보다 클 수 없다.
  2. 스택에 원소가 쌓이는 순서를 배열의 인덱스로 표현한다. 가장큰 인덱스가 top이된다.
  3. top은 0부터 n-1의 인덱스를 저장하므로, 스텍이 초기상태(공백스택, 스택에 값이 없을 때) top에는 -1을 저장한다.


※ 순차 자료구조를 통한 구현 소스

interface Stack
interface Stack{
     boolean isEmpty(); //스택이 공백스택인지 확인하는 함수
     void push(char item); //문자를 push하는 함수
     char pop(); //pop 하는 함수(top에 있는 원소를 삭제하고 반환하는 연산)
     void delete(); //top에있는 원소를 삭제한느 연산
     char peek(); //top에 있는 원소를 반환하는 연산
}

arrayStack
public class ArrayStack implements Stack {

       private int stackSize;
       private int top;
       private char ArrayItem[];

       public ArrayStack(int stackSize){

              this.top = -1;
              this.stackSize = stackSize;
              this.ArrayItem = new char[stackSize];
       }

       @Override
       public boolean isEmpty() {
              if(top == -1){
                     return true;
              }else{
                     return false;
              }
       }

       @Override
       public void push(char item) {
              if(top>this.stackSize-1){
                     System.out.println("error : stack is full");
                     return;
              }else{
                     ArrayItem[++top] = item;
              }
       }

       @Override
       public char pop() {

              if(isEmpty()){
                     System.out.println("error : stack is empty");
                     return 0;
              }else{
                     return ArrayItem[top--];
              }
       }

       @Override
       public void delete() {
              if(isEmpty()){
                     System.out.println("error : stack is empty");
              }else{
                     top --;
              }
       }

       @Override
       public char peek() {
              if(isEmpty()){
                     System.out.println("error :stack is empty");
                     return 0;
              }else{
                     return ArrayItem[top];
              }
       }

       public void printStack(){
              for(int i =0; i <=top ; i++){
                     System.out.print("index : " + i + " value : " + ArrayItem[i] +" / ");
              }
              System.out.println();
       }
}

main
public class Main {
       public static void main(String[] args) {

              int stackSize =8;
              char deleteItem;

              ArrayStack stack = new ArrayStack(stackSize);

              stack.push('A');
              stack.printStack();

              stack.push('B');
              stack.printStack();

              stack.push('C');
              stack.printStack();

              deleteItem = stack.pop();
              System.out.println("delete item : " + deleteItem);
              stack.printStack();

              System.out.println("peek value : " + stack.peek());

              stack.delete();
              System.out.println("top value : " + stack.peek());
       }
}

※ 코드 리뷰
코드 자체에 어려운 내용은 없지만 연산자의 기본에 대해 다시한번 학습하는 계기가 됐다
++top과 top++ 처럼 연산자가 앞에 붙은것과 뒤에붙은 것에는 큰 차이가 있다.
연산자가 앞에 붙으면 어떤 연산을 하기전 ++을 하고 연산을 한다는 것이고 연산자가 뒤에 붙으면 어떤 연산을 한 후 ++ 한다는 것이다. 그래서 
ArrayItem[++top] = item;
이 내용은 

top++;
ArrayItem[top]
와 같고 

return ArrayItem[top--];
이 내용은

return ArrayItem[top];
top --;
코드적으론 오류가 있지만 개념적으론 이런식이다.

또한 if(true) 이듯 if의 조건안에 boolean값을 리턴하는 함수를 넣어서 이용할 수 있다는 것을 알았다.



'플밍 is 뭔들 > 자료구조' 카테고리의 다른 글

03-4 스택의 응용  (0) 2016.11.25
03-3 스택의 구현(연결 자료구조 방식)  (0) 2016.11.25
03-1 스택  (0) 2016.11.25
02-4 이중 연결 리스트  (0) 2016.11.25
02-3 원형 연결 리스트  (0) 2016.11.25