기타 강좌

#include <stdio.h>
#include <stdlib.h>


int stack[10];
int top;
enum {PUSH = 0, POP, PRINT, EXIT};

void init_stack()
{
 top = -1;
}

void push(int nPushVal)
{
 if(top >= 9)
  printf("Stack OverFlow!! n");
 else
  stack[++top] = nPushVal;
}

int pop()
{  
    int nPopVal = 0;

 if(top < 0){
  printf("Stack is Empty!! n");
  return -1;
    }
   
 else{
    nPopVal = stack[top--];
    return nPopVal;
    }
}

void printstack()
{
 int i;
 
 for(i = 0; i<=top; i++)
  printf("%d. %d n", i, stack[i]);
}

void ShowMenu()

 printf("Select : 0)PUSH 1)POP 2)PRINT 3)EXIT n");
}

main()
{
 int nSelectNum = 0;
 int nPushVal   = 0;
 int nPopVal    = 0;


 init_stack();

 while(1)
 {
  ShowMenu();
  scanf("%d", &nSelectNum);
 
   switch(nSelectNum)
   {
   case PUSH :
    printf("Input Value : ");
    scanf("%d", &nPushVal);
    push(nPushVal);
    printf("PUSH %d n", nPushVal);
    break;

   case POP :
    nPopVal = 0;
    nPopVal = pop();
    
    if(nPopVal == -1)
    break;
    
    else
    printf("POP %d n", nPopVal);
    break;

   case PRINT :
    printstack();
    break;

   case EXIT :
    printf("EXIT!! n");
    exit(1);

   default :
    printf("Wrong Number!! n");
    break;
   }
   
             
  
  }
 }

 

휴;;(삐질삐질)  자료구조 중 가장 기본이라고 보셔도 되는 스택을 한번 구현해 봤습니다;;ㅋㅋ

오류가 있다면 댓글로 정중한 태클을 걸어주시기 바랍니다^^

-강아지포스
 


 

  

Comment '3'
  • ?
    제니스 2009.06.13 22:17

    자료구조 ㅎㅎ;;

    초보자분들이 배우기엔 ㅎㅎ

  • ?
    Cin 2009.06.14 00:00

    우선 프로그램 메인변수
    stack 10 개
    top
    enum {PUSH=0, POP, PRINT, EXIT}
        이건 값에대한 문자열 반환 같은데. . .;; 잘은...

    해석은 메인부터

    int nSelectNum,NPushVal nPopVal 생성및 초기값 0 대입

    init_stack-이름으로 봐선 stack 초기화
    =실행된 내용은 top 에 -1 대입

    다음
    while(1) //반복조건이 생략되고 상수 1이 들어갔으므로
          //항상 참인 조건이 되므로 무한반복. ; ;
          //break; 시에도 여기로 돌아와 다시 반복함.
    ShowMenu(); - 메뉴표시?
    화면에 문자표시 >> "Select : 0)PUSH 1)POP 2)PRINT 3)EXIT

    scanf("%d", &nSelectNum); 키보드에서 입력 1개 받음
           그리고 그 값을 nSelectNum 에 저장함.

    switch(nSelectNum) 여기부터 좀 이해 불가..
                     int 로 선언되었고 enum 참조도 안되었는데;
                nSelectNum이 문자열 반환이;;;???
               기초지식이 얇은 관계로 패스;
    :::PUSH 선택시
       Input Value 표시와 입력 받음
    push(nPushVal) 입력받은 값으로 Push 실행

     {
      if(top >= 9) // 입력된 값이 만든 스텍보다 많을경우()
       printf("Stack OverFlow!! n");//에러메세지[가득참.]
      else
       stack[++top] = nPushVal; // 현재 스텍에 값저장.
    >>여기에.
    | //++top 이건 전처리 문자로
    |          해당 줄이 처리되기이전에 해당값을 증가시킴.
    |    top 가 -1 이 초기값 이었으므로 이시점에서 0이됨
    | }
     printf("PUSH %d n", nPushVal);
     // 이프린트문이 push() 문 안에 들어가있는건 어떨까  생각해봄;;
     break; 이후 스위치 문은 생략함. .

    switch 문의 경우 선택된 문항 이후로 모든 처리가 되므로.
    필요한 문장이 끝났을경우 이후 불필요한 문장의 실행을
    방지하기 위하여 break; 를 넣어줍니다.

    :::POP
        nPopVal = 0; // 변수 초기화
        nPopVal = pop(); // pop 실행
    ///// pop
    int pop()
    {  
        int nPopVal = 0; //이변수는 문장처음에 선언된것과는 다른변수 입니다.
     pop()라는 변수 안에서만 사용가능한 변수로 선언됨.

     if(top < 0){  // top 가 0보다 작다 즉 -1일때이므로.

                    이는 입력되었던 값이 없었다. . .

      printf("Stack is Empty!! n"); // 스텍은 비었다.
      return -1;  // -1을 반환
        }
       
     else{
        nPopVal = stack[top--];  스택에 들어온 마지막 값을 nPopVal 에 반환후  top 를 감소 시킴
     //  ++top    top -- 문장의 전에 있는지
     // 후에 있는지에 따라.
     // 문장 실행전에 실행되는지
     // 문장 실행 후에 실행될지가 정해짐.
     // --top top++ 가능함.
        return nPopVal;   스텍에서나온값을 반환함.
     // return stack[top--]; 이건 안됨?
        }
    }
    ///
       
        if(nPopVal == -1) //반환된 값이 -1 이라면 정지됨;
     //이건 -1이란 값은 정상적으로 반환이 되더라도.
     // 값으로 인정안할수도 있을거 같네요.
            break;
        else  //-1 이 아닐경우
        printf("POP %d n", nPopVal); 스텍에서 nPopVal 갑을 빼왔습니다.
        break; //끝냄.

       case PRINT :  // 프린트 실행시.
        printstack();  실행함.
    /////*
    void printstack()
    {
     int i; // 반복문에서 쓸 변수 선언
     
     for(i = 0; i<=top; i++)  i=0 에서 스텍에 값이 들어와있는
                    //변수의 위치까지의 값을 반복함.
      printf("%d. %d n", i, stack[i]);
     //매 값을 프린트 함. 0. 33  이런식?
    }
    */////
        break; //브레이크.

       case EXIT :
        printf("EXIT!! n");//문장표시
        exit(1); //프로그램을 종료함.

       default :  //PUSH POP PRINT EXIT 가 아닌 값이 입력되면.
        printf("Wrong Number!! n"); //문장표시하고
        break;  //정지..
    그럼.. while(1) 로 돌아가서; 반복 다시.

     

  • ?
    Last H 2009.06.17 19:35

    스택을 구현 했지만 스택을 모르시는 분들이 많으실 듯 한데...

    제가 아~~주 간단히 설명드리자면 스택이란 쉽게 말해 연탄 아궁이 같은 놈입니다.

    제일 밑에 깔린 연탄은 모든 연탄을 다 뺀뒤에야 뺄 수 있다 이거죠. 즉!! 키포인트!!(FILO!!!!!! 이겁니다!! first in!! last out)

    가장 처음 들어간놈이 가장 나중에 나온다!!!

    이게 가장 중요합니다.  이게 가장 중요한 이유는 자신이 처음 있던 자리를 알 수 있기 때문이죠.

    즉 내가 출발한 지점이 가장 밑에 깔려 있으니 모든 일 처리를 끝내면 다시 자기 위치로 돌아 올 수 있는 주소를 알 수 있는겁니다.

    간단히 하려니 더 어렵게 말한듯 ...;


List of Articles
분류 제목 글쓴이 날짜 조회 수
Vegas Pro 베가스 강좌 목록 아방스 2017.09.28 886
파이널컷X 파컷 강좌 목록 아방스 2017.06.18 757
기타 게임제작에 실패하는이유는? 3 rlawnsahXP 2010.10.03 2313
기타 프로그래밍 스킴 Scheme 2 프로그래밍한 걸 exe파일 만들어 배포하기! 2 file 정체불명 2010.10.02 3156
기타 프로그래밍 스킴 Scheme 1 다운로드부터 문법 대부분을 314초만에 알려줄게요 9 file 정체불명 2010.10.02 4828
기타 시나리오 작법 서론 종합 4 wigen 2010.09.26 2178
기타 게임 기획에 관한 기법들 3 아방스 2010.09.15 3251
기타 온라인 게임 서버의 구조도 4 file Saber 2010.09.06 2509
C언어 네트워크 강좌[1]- 기본적인 버클리 소켓을 이용한 프로그래밍 Saber 2010.09.06 4013
시네마4D Cinema4D 맵핑, 매터리얼 기초 메뉴얼 아방스 2010.08.18 3517
C언어 C# - 시스템 정보 받기 2 file 코르뉴 2010.07.11 2831
에프터 이펙트 에픽 플러그인 키젠에 대한 간단한 팁 ^^ 아방스 2010.06.09 3980
에프터 이펙트 총 쏘는 듯한 효과를 만들어 볼까요? 7 아방스 2010.06.01 5784
기타 컴퓨터에 설치된 코덱 확인방법 아방스 2010.05.31 2232
기타 JHL's STUDY_캐릭터의 중심 "콘티" file J H L 2010.04.02 2197
플러그인 에펙.프리미어 플러그인 RedGiant.KnollLightFactoryPro v2.5.2 1 file 아방스 2010.03.23 5899
플러그인 에펙 플러그인 Zaxwerks 5가지 최신버젼 아방스 2010.03.23 5899
플러그인 [AE Plug-in]RedGiant.Holomatrix.v1.0 file 아방스 2010.03.23 3654
플러그인 [AE Plug-in] RedGiant.Magic Bullet Suite 2009! 3 file 아방스 2010.03.20 4438
C언어 코르뉴의 자료구조 기초 - 자기 참조 구조체(1/3) 코르뉴 2009.12.11 2924
기타 [파이썬] 함수 (플밍을 편하게))10( 4 - 하늘 - 2009.10.26 2440
기타 [파이썬] for문 (여러 번 반복하기))9( 6 - 하늘 - 2009.09.11 3877
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Next
/ 19