자료구조

[자료구조] Stack (C언어)

bebeghi3356 2024. 11. 18. 21:02

스택과 큐

  • 배열/리스트 vs 스택/큐
    • 공통점: 선형 구조 이다.
    • 차이점: 삽입과 삭제의 위치 고정 여부
      • 배열/리스트: 임의의 위치에서 삽입/삭제
      • 스택: 맨 위(top)
      • 큐:
        • 삽입: 맨 앞(front)
        • 삭제: 맨 뒤(rear)

 

 

 

 

 


구조체 포인터(다시 복습 >> 함수 선언할 시에 구조체에 포인터를 사용하기 위해)

포인터가 어떤 변수의 주소를 담아 가리키는 변수이기 때문에 구조체 포인터도 마찬가지로 구조체의 주소를 가리키는 포인터를 구조체 포인터라고 합니다. 

구조체 포인터 문법
struct 구조체이름* 구조체포인터이름;

// example
struct book my_book;
struct book* p_my_book;
p_my_book = &my_book;

배열의 경우와는 달리 구조체의 이름은 구조체를 가리키는 주소가 아닙니다.
따라서 포인터에 할당할 때는 반드시 주소 연산자(&)를 사용해야 합니다.

구조체 포인터를 이용하여 구조체 멤버에 접근하는 방법은 두 가지가 있습니다.

  1. 참조 연산자(*)를 이용하는 방법
  2. 화살표 연산자(->)를 이용하는 방법

구조체 포인터 맴버 접근
1. (*구조체포인터).멤버변수이름
2. 구조체포인터 -> 멤버변수이름

// example
(*ptr_my_book).author
ptr_my_book -> author  

(1)번과 같이 허용할 때 주의해야 할 점은 *ptr_my_book.author이 아니라 (*ptr_my_book).author와 같이 괄호를 이용한다는 것입니다. 이 *도 참조 연산자이기 때문에 *ptr_my_book.author같이 이용하면 구조체가 아닌 포인터 변수를 구조체처럼 참조하려고 하기 때문에 오류가 발생합니다.

 

출처 : https://velog.io/@kio0207/C-Programming-포인터-구조체 

 

[C Programming] 포인터 & 구조체

포인터(Pointer)와 구조체에 대한 개념과 기초 문법

velog.io

 


 

 

 

 

1. 구조체로 정의된 배열을 스택 연산으로 구현

 

#include <stdio.h>

#include <stdlib.h>

 

#define MAX_STACK_SIZE 100

 

typedef int element;

typedef struct Stack{

    element stack[MAX_STACK_SIZE];

    int top;

} Stack;

 

void init(Stack *s) {

    s->top = -1;

}

 

int is_empty(Stack *s) {

    return(s->top == -1);

}

 

int is_full(Stack *s) {

    return(s->top == (MAX_STACK_SIZE-1));

}

 

void push(Stack *s, element item){

    if(is_full(s)) {

        fprintf(stderr, "스택포화에러\n");

        return;

    }

    else s->stack[++(s->top)] = item;

}

 

 

void pop(Stack *s, element *item) {

    if(is_empty(s)) {

        fprintf(stderr, "스택공백에러\n");

        exit(1);

    }

    else {

        *item = s->stack[(s->top)--];

    }

}

 

element peek(Stack *s){

    if(is_empty(s)) {

        fprintf(stderr, "스택공백에러\n");

        exit(1);

    }

    else return s->stack[s->top];

}

 

int main(int argc, const char * argv[]) {

        Stack s;

        init(&s);  // 스택 초기화

 

        // 데이터 푸시

        push(&s, 10);

        push(&s, 20);

        push(&s, 30);

        push(&s, 40);

        push(&s, 50);

 

        // 스택의 가장 위의 값 확인

        printf("Peek: %d\n", peek(&s));  // 50 출력

 

    // 반복문을 이용하여 값 팝

    element item;

    while (!is_empty(&s)) {

        pop(&s, &item);

        printf("Pop: %d\n", item);

    }

    

        // 이제 스택은 비어있습니다.

        if (is_empty(&s)) {

            printf("스택이 비었습니다.\n");

        }

 

        return 0;

}

 

2. 연결된 스택 정의

>> 스택노드를 구조체로 정의함, 이 노드는 데이터(element item)와 다음 노드를 가리키는 포인터(struct StackNode *link)로 이루어져있다

 

 

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

[자료구조] 우선순위큐 & 힙(heap)  (0) 2024.12.02
[자료구조] 트리  (1) 2024.11.27
덱 (deque)  (0) 2024.11.27
덱(deque)  (0) 2024.11.26
[자료구조] 큐  (0) 2024.11.18