본문 바로가기
C and C++/C and C++ Examples

[C Examples] Stack push(), pop()을 활용해서 stack overflow와 underflow을 살펴보는 예제코드

by Henry Cho 2023. 10. 13.
728x90

Stack push(), pop()을 활용해서 stack overflow와 underflow을 살펴보는 예제코드

포스트 난이도: HOO_Junior


# Example Code

이번 포스트에서는 push()와 pop() 기능들을 살펴보면서 Stack에 대해서 복습해 볼 수 있다. 이전 예제코드에서 다뤘던 Struct, 구조체와 더불어 이번 코드에서는 Stack에서 사용되는 기본적인 기능들을 통해서 Stack의 overflow와 underflow가 어떻게 이루어지는 지를 살펴볼 수 있다. 코드가 점차적으로 길어지고 기능들을 추가되다 보니, 어려울 수도 있겠지만 나눠서 살펴보면 이해하기가 훨씬 수월하다. 각 기능들이 어떻게 작동하고 해당 예제코드에서 어떤 역할을 수행하는지를 우선적으로 이해해 보는 게 좋다. 예제코드를 꾸준히 직접 해 보다 보면 당장의 변화를 느낄 수는 없어도 장기적으로 코드에 대한 가독성이 높아지고 코드를 작성하는데 머릿속으로 구조화하는데 속도가 빨라지는 걸 느낄 수 있다.

 

마치 글쓴이가 하체 운동을 싫어하면서도 주기적으로 꾸준히 운동을 함으로써 멋진 엉덩이를 가질 수 있는 거와 같다. 솔직히 글쓴이의 상황보다 브로들의 코딩 실력 향상이 훨씬 더 빠를 것이다.


#include <stdio.h>
#include <stdbool.h>
#define MAX_SIZE 100

// Define
int stack[MAX_SIZE];
int top = -1;

// Function to push
void push(int value) {
    if (top >= MAX_SIZE - 1) {
        printf("Stack Overflow\n");
        return;
    }
    stack[++top] = value;
}

// Function to pop
int pop() {
    if (top == -1) {
        printf(" STACK UNDERFLOW\n");
        return -1;
    }
    return stack[top--];
}

// Function to add
void add() {
    if (top < 1) {
        printf("Insufficient operands for addition\n");
        return;
    }
    int operand2 = pop();
    int operand1 = pop();
    push(operand1 + operand2);
}

// Function to divide
void divide() {
    if (top < 1) {
        printf("Insufficient operands for division\n");
        return;
    }
    int operand2 = pop();
    int operand1 = pop();
    if (operand2 == 0) {
        printf("Division by zero\n");
        return;
    }
    push(operand2 / operand1);
}

void displayStack() {
    if (top == -1) {
        printf("Stack is empty\n");
        return;
    }
    for (int i = 0; i <= top; i++) {
        printf("\nPushing %d", stack[i]);
    }
    printf("\n");
}

// Display
void displayStackBar() {
    if (top == -1) {
        printf("Stack is empty\n");
        return;
    }

    for (int i = top; i >= 0; i--) {
        printf(" |%d|\n", stack[i]);
    }
    printf("\n");
}

// Main block
int main() {
    push(10);
    push(11);
    push(12);
    push(13);
    push(14);

    printf("Pushing 5 values to the stack:");
    displayStack();
    
    printf("Displaying the Stack:\n");
    displayStackBar();

    printf("\nAdding top two numbers and pushing the sum onto the stack:\n");
    add();
    displayStackBar();

    printf("Pops the first two values off the stack and divide. Then push it back onto the stack:\n");
    divide();
    displayStackBar();

    printf("Popping values from the stack:\n");
    int poppedValue = pop();
    printf("%d\n", poppedValue);
    poppedValue = pop();
    printf("%d\n", poppedValue);
    poppedValue = pop();
    printf("%d\n", poppedValue);

    printf("\nAttempting to pop a value that isn't there:\n");
    poppedValue = pop();
    
    return 0;
}

Figure 1. Result of Example Code


# github link

https://github.com/WhoisHOO/HOOAI/blob/main/C%20Examples/stack_push_pop


 

728x90

댓글