기타 강좌

#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
C언어 [ - Zennys - ] 제니스의 C언어 강좌 [태그] 1 제니스 2009.06.13 2149
C언어 [-구름-] 배열로 큐 구현하기 3 [SST]구름 2009.06.13 3610
C언어 [-구름-] 배열로 스택구현하기 3 [SST]구름 2009.06.13 2747
C언어 [ - Zennys - ] 제니스의 C언어 강좌 [include] 3 제니스 2009.06.13 3125
C언어 [ - Zennys - ] 제니스의 C언어 예제ㅡ 2 file 제니스 2009.06.13 2595
C언어 [ - Zennys - ] 제니스의 C언어 강좌 [열거형,정의] 제니스 2009.06.13 2558
C언어 [ - Zennys - ] 제니스의 C언어 강좌 [3중문자] 1 제니스 2009.06.13 2352
C언어 [ - Zennys - ] 제니스의 C언어 강좌 [문자열] 제니스 2009.06.13 2840
C언어 [ - Zennys - ] 제니스의 C언어 강좌 [확장열] 제니스 2009.06.13 2472
C언어 [ - Zennys - ] 제니스의 C언어 강좌 [아스키(ASCII)코드] 1 제니스 2009.06.13 3643
C언어 [ - Zennys - ] 제니스의 C언어 강좌 [실수형 상수] 제니스 2009.06.13 3089
C언어 [ - Zennys - ] 제니스의 C언어 강좌 [실수형 종류] 1 제니스 2009.06.13 3073
C언어 컴파일러 다운하세용.. 1 제니스 2009.06.13 2685
C언어 [ - Zennys - ] 제니스의 C언어 강좌 [정수형 상수] 제니스 2009.06.13 2989
C언어 [ - Zennys - ] 제니스의 C언어 강좌 [정수의 길이] 1 제니스 2009.06.13 2395
C언어 [ - Zennys - ] 제니스의 C언어 강좌 [정수의 정의] 4 제니스 2009.06.13 2664
C언어 [ - Zennys - ] 제니스의 C언어 강좌 [그외 입출력 함수] -Zennys- 2009.06.13 2764
C언어 [ - Zennys - ] 제니스의 C언어 강좌 [scanf함수] -Zennys- 2009.06.13 2377
C언어 [ - Zennys - ] 제니스의 C언어 강좌 [printf함수] file -Zennys- 2009.06.13 1878
C언어 [ - Zennys - ] 제니스의 C언어 강좌 [변수의 선언] -Zennys- 2009.06.13 2175
Board Pagination Prev 1 ... 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Next
/ 19