못정함

4장. 스택 본문

자료구조

4장. 스택

hadara 2024. 10. 16. 16:54

 

#include <stdio.h>
#include <stdlib.h>
#define STACK_MAX 100

////하나의 프로그램에서 여러 개의 스택 다루기....

typedef struct {
    int number; //선수번호
    char name[30]; //이름
} player;

typedef struct {
    player player[STACK_MAX];
    int top;
} Stack;

//////////필요한 함수/////////////
void initStack(Stack* s);   ///stack의 주소로 전달
int isFull(Stack* s);
int isEmpty(Stack*  s);
void push(Stack* s, player p);

player pop(Stack* s);
player peek(Stack* s);  //가장 위의 값을 알려줌. pop과 비슷한데 return만함. 삭제는 안됨

//////////////////////////////////

int main()
{
    Stack stack;  //스택 선언
    initStack(&stack);   //주소를 넘겨줘야함. 스택 초기화

    //선수 데이터
    player p1 = {10, "Hong"};
    player p2 = {20, "Lee"};
    player p3 = {30, "Kim"};

    //스택에 선수 추가
    push(&stack, p1);
    push(&stack, p2);
    push(&stack, p3);

    //스택의 최상단 선수 확인
    peek(&stack);

    //스택에서 선수 제거
    pop(&stack);   //top이 제거됨. 결과: p3 (제거된 애를 보여줌)

    //스택에서 다시 최상단 선수 확인
    peek(&stack);

    return 0;
}


/////////////////////////////


///stack의 주소로 전달
void initStack(Stack* s)
{
    s -> top = -1;  // 포인터를 top을 가리키게 하고 -1로 설정
}


int isFull(Stack* s)
{
   return s -> top == STACK_MAX -1;
}


int isEmpty(Stack*  s)
{
    return s -> top == -1;
    // 멤버변수에 접근하는 것. 포인터이름 -> 멤버변수이름
}


void push(Stack* s, player p)
{
    if(isFull(s))
    {
        printf("stack is full \n");
        return;
    }
    else {
        s -> player[++(s->top)] = p;
        printf("your data is pushed: player.num: %d, player.name:%s\n", p.number, p.name);
        /*주소에 데이터 추가 시
        포인터이름 -> 멤버변수이름 = 값; */

    }
}

player pop(Stack* s)
{
    player p = {0, ""};

    if(isEmpty(s))
    {
        printf("Stack is empty\n");
        //return;
    }
    else{
       p = s-> player[(s->top)--];
       printf("popped) num: %d, name: %s\n", p.number, p.name);
    }
}

//가장 위의 값을 알려줌. pop과 비슷한데 return만함. 삭제는 안됨
player peek(Stack* s)
{
    player p = {0, ""};

    if(isEmpty(s))
    {
        printf("stack is empty\n");
        return p;
    }
    else
    {
        p = s-> player[s->top];
        printf("PEEK is...num: %d, name %s \n", p.number, p.name);
    }
        
}