기타 강좌

#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
기타 XNA로 게임만들기 - 3. 자신만의 라이브러리를 만들자. 7 file 재훈군 2012.08.03 3454
기타 VirtualDub, Avanti, AviSynth를 사용한 초보적인(?!) DVD -> 동영상 파일 변환법. Alkaid 2012.08.27 3480
시네마4D Cinema4D 맵핑, 매터리얼 기초 메뉴얼 아방스 2010.08.18 3517
C언어 소코반 실행파일+소스+스크린샷 file 정체불명 2012.01.25 3520
C언어 [C언어] for문과 while문에 대해 [Dark].Angel 2009.01.14 3521
웹디자인 관련 웹 디자인 무료 버튼 템플릿! - Wide Green Button file 아방스 2011.12.07 3526
C언어 [C언어] 산술연산자, 대입연산자, 증감연산자 란? 2 [Dark].Angel 2009.01.14 3541
기타 윈도우 XP에서 16비트 도스가 실행이 안될때 스크립트 2008.07.25 3567
웹디자인 관련 웹 디자인 무료 버튼 템플릿! - Web 2.0 Download Buttons file 아방스 2011.12.07 3575
C언어 [비쥬얼 C++ 동영상 강좌] 01회 Visual C++개요, 간단한 C++맛보기 2 아방스 2009.01.12 3590
C언어 [-구름-] 배열로 큐 구현하기 3 [SST]구름 2009.06.13 3610
C언어 [ - Zennys - ] 제니스의 C언어 강좌 [아스키(ASCII)코드] 1 제니스 2009.06.13 3643
플러그인 [AE Plug-in]RedGiant.Holomatrix.v1.0 file 아방스 2010.03.23 3654
C언어 한글자씩 출력하기 file 정체불명 2012.01.21 3730
기타 인스톨 팩토리 사용법~ 5 file Skybound 2009.05.11 3773
기타 바이러스 제작 모험기 : 상편.shutdown명령어! 4 file 창조자 신 2009.05.16 3779
C언어 [C언어] 난수에 대해 2 [Dark].Angel 2009.01.14 3785
기타 [파이썬] for문 (여러 번 반복하기))9( 6 - 하늘 - 2009.09.11 3877
기타 포토샵 크기 조절 1 제니스 2008.06.22 3914
에프터 이펙트 에픽 플러그인 키젠에 대한 간단한 팁 ^^ 아방스 2010.06.09 3980
Board Pagination Prev 1 ... 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Next
/ 19