Stack ÀڷᱸÁ¶
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

Docbook ¿ø¹®

Stack µ¥ÀÌŸ Ãß»ó

1절. ¼Ò°³

ÀÌ ¹®¼­´Â Stack µ¥ÀÌŸ Ãß»ó¿¡ ´ëÇØ¼­ ´Ù·é´Ù. ¸Å¿ì °£´ÜÇϰí Á÷°üÀûÀÎ ³»¿ëÀÓÀ¸·Î ºÎ´ã¾øÀÌ Àб⠹ٶõ´Ù.


2절. Stack

Stack ÀÇ ÀÚ·áÀúÀå ÇüÅ´ ¹è¿­°ú µ¿ÀÏÇÏ´Ù. ´Ù¸¸ ÀڷḦ »©³»¿À´Â ¼ø¼­¿¡ µû¶ó¼­ Stack ÀÎÁö°¡ ±¸ºÐµÇ¾îÁø´Ù.


2.1절. Stack µ¥ÀÌŸ Ãß»ó

Stack ´Â "´õ¹Ì" ¶õ ¶æÀ» °¡Áø´Ù. Ã¥´õ¹Ì, ½Å¹®´õ¹Ì µî¿¡ »ç¿ëÇÏ´Â ¹Ù·Î ±× ´õ¹Ì ÀÌ´Ù. Ã¥´õ¹Ì¸¦ ¿¹·Î µé¾îº¸ÀÚ Ã¥´õ¹Ì¸¦ ½×¾Ò´Ù°í ÇßÀ»¶§, ÀÌ Ã¥´õ¹Ì¿¡¼­ Ã¥À» °¡Á®¿À´Â °¡Àå Á¤»óÀûÀÎ ¹æ¹ýÀº Á¦ÀÏ À§¿¡ Àִ åÀ» °¡Á®¿À´Â ¹æ½ÄÀÌ´Ù.

´Ù½Ã ¸»ÇÏÀÚ¸é °¡Àå ¸ÕÀú µé¾î°£ Ã¥Àº °¡Àå ³ªÁß¿¡ ²¨³¾¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÌ·±½ÄÀ¸·Î ÀÚ·á°¡ °¡Àå ¹Ø¿¡ ½×À̰í(ÀÔ·Â), ÀڷḦ °¡Á®¿Ã¶§(Ãâ·Â)´Â °¡Àå À§(ÃÖ±Ù)ÀÇ ÀڷḦ °¡Á®¿À´Â ÀڷᱸÁ¶¸¦ Stack ¶ó°í ÇÑ´Ù. ÀÌ·¯ÇÑ Stack ÀÇ Æ¯Â¡¶§¹®¿¡ ÈçÈ÷ "FILO (First-In-Last-Out)" ȤÀº "LIFO (Last-In-First-Out)" ¶ó°í ÇÑ´Ù. ¼±ÀÔÈÄÃâ, ÈÄÀÔ¼±Ãâ Çü ÀڷᱸÁ¶ÀÌ´Ù.

그림 1. Stack ÀڷᱸÁ¶

그림 1 Àº Stack ÀڷᱸÁ¶ÀÇ ¸ð½ÀÀÌ´Ù. A °¡ °¡Àå ¸ÕÀú ÀÔ·ÂµÈ °ªÀ̰í E °¡ °¡Àå ¸¶Áö¸·À¸·Î ÀÔ·ÂµÈ °ªÀÌ´Ù. °ªÀ» °¡Á®¿Ã¶§´Â °¡Àå ÃÖ±Ù¿¡ ÀÔ·ÂµÈ µ¥ÀÌŸÀÎ E ¸¦ °¡Á®¿À°Ô ÀÌ´Ù. ¸¸¾à¿¡ F ¶ó´Â »õ·Î¿î ÀڷḦ ÀÔ·ÂÇÑ´Ù¸é, °¡Àå À­ºÎºÐ¿¡ ½×ÀÌ°Ô µÉ°ÍÀÌ´Ù.

Stack µ¥ÀÌŸ Ãß»óÀº ÀÚ·áÀÇ ÀÔÃâ·ÂÀÌ LIFO°¡ µÇµµ·Ï ±¸ÇöÇÏ¸é µÈ´Ù.


2.1.1절. Stack ±¸ÇöÀ» À§ÇØ ±â¼úµÇ¾î¾ßÇÒ Çൿ

Çൿ ´ë½Å ¸Þ¼­µå¶ó°í ÇØµµ °ü°è´Â ¾ø´Ù. Stack ´Â LIFO ÀÚ·áÀÔÃâ·ÂÀ» À§Çؼ­ º¸Åë 4°¡ÁöÀÇ ¸Þ¼­µå°¡ ±â¼úµÈ´Ù. Áï Push ¿Í Pop, Empty, Size ÀÌ´Ù. ±×¸®°í À̿ܿ¡ stack »çÀÌÁî°ü¸® µîÀ» À§ÇÑ capacity¿Í °°Àº ¸î°¡Áö ¸Þ¼­µå¸¦ ºÎ°¡ÀûÀ¸·Î ±¸ÇöÇÒ¼öµµ ÀÖÀ»°ÍÀÌ´Ù. "Çʼö" ¶ó°í µÇ¾îÀÖ´Â °ÍÀº stack ÀÇ Çʼö ÇൿµéÀ̰í "À¯¿ë" À̶ó°í µÇ¾î Àִ°ÍÀº ±¸ÇöµÇ¸é µµ¿òÀÌ µÇ´Â ÇൿµéÀÌ´Ù.

표 1. Stack ±âº» Çൿ

Pushstack ÀÇ °¡Àå À§(top)¿¡ µ¥ÀÌŸ¸¦ ÀúÀåÇÑ´Ù.Çʼö
Popstack ÀÇ °¡ÀåÀ§¿¡ ÀÖ´Â µ¥ÀÌŸ¸¦ °¡Á®¿Â´Ù. °¡Á®¿Â µ¥ÀÌŸ´Â stack ¿¡¼­ »èÁ¦ÇÑ´Ù. Çʼö
Emptystack °¡ ºñ¾îÀÖ´ÂÁö È®ÀÎÇÑ´Ù.Çʼö
Size½ºÅÿ¡ µé¾îÀÖ´Â ¿ø¼Ò°¹¼ö¸¦ µ¹·ÁÁØ´Ù.À¯¿ë
Capacity½ºÅÃÀÇ Å©±â - ´ãÀ»¼ö ÀÖ´Â ¿ø¼Ò°¹¼ö - ¸¦ ±¸ÇÑ´Ù.À¯¿ë


2.1.2절. ±¸Çö ¹× Å×½ºÆ®

2.1.2.1절. Stack Class

À§ÀÇ "Stack ±âº» Çൿ" À» ¸ðµÎ ±¸ÇöÇÒ¼ö ÀÖµµ·Ï Ŭ·¡½º¸¦ Á¦ÀÛÇÑ´Ù. Stack µ¥ÀÌŸ Ãß»óÀ» À§Çؼ­ Ŭ·¡½º¸¦ »ç¿ëÇÏ´Â ÀÌÀ¯´Â ADT ÀÇ ±¸ÇöÀÌ ¿ëÀÌÇϱ⠶§¹®ÀÌ´Ù. ±×¸®°í À̹ø¿¡´Â Á»´õ "ÀϹÝÀûÀÎ" Stack µ¥ÀÌŸ Ãß»óÀ» À§Çؼ­ Template class ¸¦ ÀÌ¿ëÇϵµ·Ï ÇϰڴÙ.

stack.h

#include <string>
#include <iostream>

using namespace std;

template <typename T>
class stack
{
    private:
        T *container;    // ÀúÀå¼Ò 
        int member_num;  // ½ºÅÿ¡ ÀúÀåµÈ ¿ø¼ÒÀÇ °¹¼ö
        int stack_size;  // ½ºÅÃÀÇ ¿ë·®Å©±â
        int ele_sizeof;  // ŸÀÔ T ÀÇ sizeof

    public:
        // »ý¼ºÀÚ 
        // µðÆúÆ® ÀÎÀÚ·Î ½ºÅÃÀÇ ¿ë·®Å©±â¸¦ ¹Þ¾ÆµéÀδÙ.  
        // ¿ë·®Å©±â ¸¸Å­ ¸Þ¸ð¸® ÇÒ´çÇϰí
        // ¸î°¡Áö °ªÀ» ÃʱâÈ­ ÇÑ´Ù.  
        stack(int asize=12)
        {
            stack_size = asize;
            member_num = 0;
            ele_sizeof = sizeof(T);
            container = (T *)malloc(ele_sizeof * stack_size);
        }

        // ¼Ò¸êÀÚ
        // ½ºÅÃÀ» free ÇÑ´Ù. 
        ~stack()
        {
            free(container);
        }

        // µ¥ÀÌŸ¸¦ ½ºÅÿ¡ ÀÔ·ÂÇÑ´Ù.  
        // ¸¸¾à ½ºÅûçÀÌÁî°¡ ²ËÂ÷ÀÖ´Ù¸é 
        // realloc ¸¦ È£ÃâÇØ¼­ ½ºÅûçÀÌÁ 
        // (ÇöÀç ½ºÅûçÀÌÁî * 2) ¸¸Å­ ´Ã·ÁÁØ´Ù.
        void push_back(T data)
        {
            if (member_num == (stack_size - 1))
            {
                stack_size *= 2;
                container = (T *)realloc(container, ele_sizeof * stack_size);
            }
            *(container + member_num) = data;
            member_num++;
        }

        // ½ºÅÿ¡¼­ µ¥ÀÌŸ¸¦ ²¨³½´Ù.  
        T pop_back()
        {
            member_num --;
            return *(container+member_num);
        }

        // µ¥ÀÌŸ°¡ ºñ¾îÀÖ´ÂÁö È®ÀÎÇÑ´Ù. 
        bool empty()
        {
            return member_num == 0;
        }

        // ½ºÅÿ¡ ÀúÀåµÈ µ¥ÀÌŸÀÇ °¹¼ö 
        int size()
        {
            return member_num;
        }

        // ½ºÅÃÀÇ ¿ë·®
        int capacity()
        {
            return stack_size;
        }
};
					
½î¾²´Â °£´ÜÇÔÀ¸·Î ¼³¸íÇÏÁö ¾Ê°Ú´Ù.

´ÙÀ½Àº ÅÛÇø´ Ŭ·¡½º·Î ±¸ÇöÇÑ stack ÀÚ·áÃß»óÀÇ ±¸ÇöÀÌ ÀߵǾú´ÂÁö È®ÀÎÇϱâ À§Çؼ­ ¸¸µç main() ÇÔ¼ö¸¦ Æ÷ÇÔÇÑ Å×½ºÆ®¿ë ÄÚµåÀÌ´Ù.

stack_test.cc

#include "stack.h"
#include <iostream>
using namespace std;
int main()
{
    stack<int> mystack(2);
    int i, size;

    cout << "Capacity " << mystack.capacity()<< endl;
    mystack.push_back(1);
    mystack.push_back(2);
    mystack.push_back(3);
    mystack.push_back(4);
    cout << "Capacity " << mystack.capacity()<< endl;

    cout << "size : " << mystack.size() << endl;

    size = mystack.size();
    for (i  = 0; i < size; i++)
    {
        cout << mystack.pop_back() << endl;
    }

    if (mystack.empty())
    {
        cout << "stack is empty" << endl;
    }
}
					
À§ÀÇ ÄÚµå´Â ¾µ¸¸ÇÏ°Ô ÀÛµ¿ÇÏÁö¸¸ string, vector °ú °°Àº ÀÚ·áÇüÀº °ªÀ¸·Î »ç¿ëÇÒ¼ö ¾øµµ·ÏµÇ¾îÀÖ´Ù. À̵éÀº malloc() ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ¸Þ¸ð¸® ÇÒ´çÀÌ °¡´ÉÇÏÁö ¾Ê±â ¶§¹®ÀÌ´Ù. ÀÌ·²°æ¿ì malloc ´ë½Å new ¸¦ »ç¿ëÇÏ¸é µÉ°ÍÀε¥, À̰ÍÀº °¢ÀÚ ÄÚµùÇØº¸±â ¹Ù¶õ´Ù.


Cache Error
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.