728x90

1.스택(Stack)

스택(stack)이란 쌓아 올린다는 것을 의미한다.

 

#스택의 특징

  • 스택은 같은 구조와 크기의 자료 정해진 방향으로만 쌓을수 있고,top으로 정한 곳을 통해서만 접근할 수 있다.
  • top에는 가장 위에 있는 자료는 가장 최근에 들어온 자료를 가리키고 있으며,삽입되는 새 자료는 top이 가리키는 자료의 위에 쌓이게 된다.
  • 스택에서 자료를 삭제할 때도 top을 통해서만 가능하다.
  •  후입선출(LIFO: Last In First Out)의 자료구조이며, 접근이 목록의 끝(Top 또는 Top Pointer)에서만 일어나기 때문에 Pushdown List 라고도 합니다.
  • 스택에서 입력은 push, 출력은 pop, Top 위치의 데이터 확인은 peek 를 사용합니다.

#스택이 실제로 사용되는 경우

 

  • 운영체제(OS: Operating System)
    프로그램에서 사용되는 함수들을 스택 자료형에 저장하여 사용한다..
  • 컴파일러(Compiler)
    수학 기호들을 기계어로 변환시 사용한다.
  • 자바 가상 머신(JVM: Java Virtual Machine)
    JVM 내에서 메서드가 실행, 종료될 때 스택 프레임을 이용하여 관리한다.

JAVA로 구현한 스택 소스코드

package data_structure;

interface Stack{
    boolean isEmpty();
    boolean isFull();
    void push(char item);
    char pop();
    char peek();
    void clear();

}
public class MyStack implements Stack{
    private int top;
    private int stackSize;
    private char stackArr[];

    //스택을 생성하는 생성자
    public MyStack(int stackSize){
        top = -1; //스택 포인터 초기화
        this.stackSize = stackSize;  //스택사이즈 설정
        stackArr = new char[this.stackSize];  //스택 배열 생성
    }

    //스택이 비어 있는지 확인
    public boolean isEmpty() {
        //스택포인터가 -1인 경우 데이터가 없는 상태이므로 true 아닌 경우 false 를 리턴,
        return (top== -1);
    }

    //스택이 가득찬 상태인지 확
    public boolean isFull() {
        //스택 포인터가 스택의 마지막 인덱스와 동일한 경우 true 아닌 경우 false 를 리턴;
        return(top == this.stackSize-1);
    }
    //스택에 데이터 추가
    public void push(char item) {
        if(isFull()){
            System.out.println("stack is full");
        }else{
            stackArr[++top] = item;  //다음 스택 포인터가 가리키는 인덱스에 데이터 추가
            System.out.println("Inserted item : "+ item);
        }
    }
    //스택의 최상위(마지막) 데이터 추출 후 삭제
    public char pop() {
        if(isEmpty()){
            System.out.println("Deleting fail! Stack is empty");
            return 0;
        }else{
            System.out.println("Deleted item : "+ stackArr[top]);
            return stackArr[top--];
        }
    }
    // 스택의 최상위(마지막) 데이터 추출
    public char peek() {
        if(isEmpty()){
            System.out.println("Peeking fail! Stack is empty");
            return 0;
        }else{
            System.out.println("Peeked Item : "+ stackArr[top]);
            return stackArr[top];
        }
    }
    //스택 초기화
    public void clear() {
        if(isEmpty()){
            System.out.println("Stack is already empty!");
        }else{
            top = -1;  //스택 포인터 초기화
            stackArr = new char[this.stackSize]; //새로운 스택 배열 생성
            System.out.println("Stack is clear!");
        }
    }
    //스택에 저장된 모든 데이터 출력
    public void printStack(){
        if(isEmpty()){
            System.out.print("Stack is Empty");
        }else{
            System.out.print("Stack is element : ");
            for(int i=0; i<=top; i++){
                System.out.print(stackArr[i]+" ");
            }
            System.out.println();
        }
    }

실행코드와 결과

 public static void main(String[] args) {

            int stackSize = 5;
            MyStack arrStack = new MyStack(stackSize);

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

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

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

            arrStack.pop();
            arrStack.printStack();

            arrStack.pop();
            arrStack.printStack();

            arrStack.peek();
            arrStack.printStack();

            arrStack.clear();
            arrStack.printStack();
        }

결과

 

 

 

다음엔 큐(queue)에 대해서  정리해보겠습니다.😁🙈

728x90

'Dev > 알고리즘 ,자료구조' 카테고리의 다른 글

[Algorithm]BeakJoon_1330  (0) 2021.07.18
Insertion_Sort(삽입 정렬)  (0) 2021.06.30
Selection_Sort(선택 정렬)  (0) 2021.06.29
Bubble_Sort(거품 정렬)+JAVA로 구현  (0) 2021.06.28
자료구조_배열(Array)  (0) 2021.03.11