C/자료구조와 알고리듬
                
              Chapter 06. 스택(Stack)
                GameStudy
                 2021. 11. 10. 15:04
              
                          
            2.1 스택 기본 코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <assert.h>
enum {
    FALSE = 0,
    TRUE = 1,
    INVALIED_INDEX = -1,
    MAX_COUNT = 100001
};
typedef struct stack {
    int nArray[MAX_COUNT];
    size_t uTop;
} stack_t;
void push(stack_t* _pStack, int _nData);
int isEmpty(stack_t* _pStack);
int pop(stack_t* _pStack);
int main(void)
{
    return 0;
}
void push(stack_t* _pStack, int _nData)
{
    assert(_pStack->uTop < MAX_COUNT);
    _pStack->nArray[_pStack->uTop++] = _nData;
}
int isEmpty(stack_t* _pStack)
{
    if (0 == _pStack->uTop)
    {
        return TRUE;
    }
    return FALSE;
}
int pop(stack_t* _pStack)
{
    assert(FALSE == isEmpty(_pStack));
    return _pStack->nArray[--_pStack->uTop];
}
2.2 CodeUp 문제 풀이
// 1402 거꾸로 출력하기3
#include <stdio.h>
#include <assert.h>
enum { ... };
typedef struct stack { ... } stack_t;
void push(stack_t* _stack, int _nData);
int is_empty(stack_t* _stack);
int pop(stack_t* _stack);
int main(void)
{
    int     ans;
    size_t  i, size;
    stack_t st;
    scanf("%zu", &size);
    for (i = 0; i < size; ++i)
    {
        scanf("%d", &ans);
        push(&st, ans);
    }
    for (i = 0; i < size; ++i)
    {
        printf("%d ", pop(&st));
    }
    return 0;
}
void push(stack_t* _stack, int _nData)
{
    ...
}
int is_empty(stack_t* _stack)
{
    ...
}
int pop(stack_t* _stack)
{
    ...
}
// 1714 숫자 거꾸로 출력하기
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <assert.h>
enum {
    ...
};
typedef struct stack {
    ...
} stack_t;
void push(stack_t* _stack, int _nData);
int is_empty(stack_t* _stack);
int pop(stack_t* _stack);
int main(void)
{
    int         answer;
    size_t      i = 0, j;
    stack_t     stOriginal = { 0, }, stReverse = { 0, };
    scanf("%d", &answer);
    if (0 == answer)
    {
        printf("0");
        return 0;
    }
    else
    {
        while (0 < answer)
        {
            push(&stOriginal, answer % 10);
            answer /= 10;
            ++i;
        }
    }
    for (j = i; j > 0; --j)
    {
        push(&stReverse, pop(&stOriginal));
    }
    for (j = i; j > 0; --j)
    {
        printf("%d", pop(&stReverse));
    }
    return 0;
}
void push(stack_t* _stack, int _nData)
{
    ...
}
int is_empty(stack_t* _stack)
{
    ...
}
int pop(stack_t* _stack)
{
    ...
}
이진수 만들기
...
enum {
    FALSE = 0,
    TRUE = 1,
    INVALIED_INDEX = -1,
    MAX_COUNT = 32
};
typedef struct stack {
    ...
} stack_t;
void push(stack_t* _pStack, int _nData);
int isEmpty(stack_t* _pStack);
int pop(stack_t* _pStack);
int main()
{
    stack_t st = {0,};
    int i, j, n, n_1;
    scanf("%d", &n);
    for (i = 0; ; ++i)
    {
        n_1 = n % 2;
        push(&st, n_1);
        n /= 2;
        if (n <= 0)
        {
            break;
        }
    }
    for (j = 0; j <= i; ++j)
    {
        printf("%d", pop(&st));
    }
    return 0;
}
...
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
enum
{
    FALSE = 0,
    TRUE = 1,
    INVALIED_INDEX = -1,
    MAX_COUNT = 32
};
typedef struct stack
{
    int nArray[MAX_COUNT];
    size_t uTop;
} stack_t;
void push(stack_t* _pStack, int _nData);
int isEmpty(stack_t* _pStack);
int pop(stack_t* _pStack);
int main()
{
    stack_t st = {0,};
    size_t i, n;
    int cnt = 1;
    int input[101] = {0,}, trash;
    scanf("%zu", &n);
    for (i = 0; i < n; ++i)
    {
        scanf("%d", &input[i]);
    }
    for (i = 0; i < n; ++i)
    {
        while (TRUE)
        {
            if (input[i] != st.nArray[st.uTop])
            {
                push(&st, cnt++);
                printf("+ ");
            }
            else
            {
                trash = pop(&st);
                printf("- ");
            }
            if (TRUE == isEmpty(&st))
            {
                break;
            }
        }
    }
    return 0;
}
void push(stack_t* _pStack, int _nData)
{
    assert(_pStack->uTop < MAX_COUNT);
    _pStack->nArray[_pStack->uTop++] = _nData;
}
int isEmpty(stack_t* _pStack)
{
    if (_pStack->uTop == 0)
    {
        return TRUE;
    }
    return FALSE;
}
int pop(stack_t* _pStack)
{
    assert(FALSE == isEmpty(_pStack));
    return _pStack->nArray[--_pStack->uTop];
}
2014 스택 수열
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <assert.h>
#include <string.h>
enum {
    FALSE = 0,
    TRUE = 1,
    INVALID_INDEX  = -1,
    MAX_COUNT = 100001
};
typedef struct stack {
    int nArray[MAX_COUNT];
    size_t uTop;
} stack_t;
void push(stack_t* _pStack, int _nData);
int isEmpty(stack_t* _pStack);
int pop(stack_t* _pStack);
int top(stack_t* _pStack);
size_t size(stack_t* _pStack);
void print(stack_t* _pStack);
int main(void)
{
    stack_t st = {0,};
    int i, nNumCnt, nInputArrCnt = 1, nStrCnt = 1;
    int arrInput[MAX_COUNT] = {0,};
    char str[MAX_COUNT] = {0,};
    scanf("%d", &nNumCnt);
    for (i = 1; i <= nNumCnt; ++i)
    {
        scanf("%d", &arrInput[i]);
    }
    for (i = 1; i <= nNumCnt; ++i)
    {
        push(&st, i);
        str[nStrCnt++] = '+';
        while (FALSE == isEmpty(&st) && arrInput[nInputArrCnt] == top(&st))
        {
            pop(&st);
            ++nInputArrCnt;
            str[nStrCnt++] = '-';
        }
    }
    if (FALSE == isEmpty(&st))
    {
        printf("NO");
        return 0;
    }
    for (i = 1; i < nStrCnt; ++i)
    {
        printf("%c\n", str[i]);
    }
    return 0;
}
void push(stack_t* _pStack, int _nData)
{
    assert(_pStack->uTop < MAX_COUNT);
    _pStack->nArray[_pStack->uTop++] = _nData;
}
int isEmpty(stack_t* _pStack)
{
    if (_pStack->uTop == 0)
    {
        return TRUE;
    }
    return FALSE;
}
int pop(stack_t* _pStack)
{
    /* assert(FALSE == isEmpty(_pStack)); */
    if (TRUE == isEmpty(_pStack))
    {
        return -1;
    }
    return _pStack->nArray[--_pStack->uTop];
}
int top(stack_t* _pStack)
{
    if (TRUE == isEmpty(_pStack))
    {
        return -1;
    }
    return _pStack->nArray[_pStack->uTop-1];
}
size_t size(stack_t* _pStack)
{
    return _pStack->uTop;
}
void print(stack_t* _pStack)
{
    size_t i;
    for (i = 0; i < _pStack->uTop; ++i)
    {
        printf("%c", _pStack->nArray[i]);
    }
    printf("\n");
}
2010 탑(반대로)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <assert.h>
#include <string.h>
enum {
    FALSE = 0,
    TRUE = 1,
    INVALID_INDEX = -1,
    MAX_COUNT = 101
};
typedef struct stack {
    int nArray[MAX_COUNT];
    size_t uTop;
} stack_t;
void push(stack_t* _pStack, int _nData);
int isEmpty(stack_t* _pStack);
int pop(stack_t* _pStack);
int top(stack_t* _pStack);
size_t size(stack_t* _pStack);
void print(stack_t* _pStack);
int main(void)
{
    stack_t st = { 0, };
    int i, nNumCnt;
    int arrInput[MAX_COUNT] = { 0, };
    int arrReceive[MAX_COUNT] = { 0, };
    int cnt = 1;
    scanf("%d", &nNumCnt);
    for (i = 1; i <= nNumCnt; ++i)
    {
        scanf("%d", &arrInput[i]);
    }
    for (i = nNumCnt; i >= 1; --i)
    {
        if (TRUE == isEmpty(&st))
        {
            push(&st, arrInput[i]);
            continue;
        }
        if (top(&st) < arrInput[i])
        {
            while (FALSE == isEmpty(&st) && top(&st) < arrInput[i])
            {
                arrReceive[i + cnt] = i;
                ++cnt;
                pop(&st);
            }
            push(&st, arrInput[i]);
        }
        else
        {
            push(&st, arrInput[i]);
        }
        cnt = 1;
    }
    for (i = 1; i <= nNumCnt; ++i)
    {
        printf("%d ", arrReceive[i]);
    }
    return 0;
}
void push(stack_t* _pStack, int _nData)
{
    assert(_pStack->uTop < MAX_COUNT);
    _pStack->nArray[_pStack->uTop++] = _nData;
}
int isEmpty(stack_t* _pStack)
{
    if (_pStack->uTop == 0)
    {
        return TRUE;
    }
    return FALSE;
}
int pop(stack_t* _pStack)
{
    /* assert(FALSE == isEmpty(_pStack)); */
    if (TRUE == isEmpty(_pStack))
    {
        return -1;
    }
    return _pStack->nArray[--_pStack->uTop];
}
int top(stack_t* _pStack)
{
    if (TRUE == isEmpty(_pStack))
    {
        return -1;
    }
    return _pStack->nArray[_pStack->uTop - 1];
}
size_t size(stack_t* _pStack)
{
    return _pStack->uTop;
}
void print(stack_t* _pStack)
{
    size_t i;
    for (i = 0; i < _pStack->uTop; ++i)
    {
        printf("%c", _pStack->nArray[i]);
    }
    printf("\n");
}
탑 C++ 버전
#include <bits/stdc++.h>
using namespace std;
stack< pair<int, int> > st;
int main(void)
{
    int nTopCount, nTopHeight;
    scanf("%d", &nTopCount);
    for (int i = 1; i <= nTopCount; i++)
    {
        scanf("%d", &nTopHeight);
        while (false == st.empty())
        {
            if (st.top().second < nTopHeight)
            {
                st.pop();
            }
            else
            {
                printf("%d ", st.top().first);
                break;
            }
        }
        if (true == st.empty())
        {
            printf("0 ");
        }
        st.push(make_pair(i, nTopHeight));
    }
    return 0;
}