'Stack'에 해당되는 글 2건

#include <stdio.h>
#define MAX_STACK_SIZE 100
#define MAX_EXPR_SIZE 100

typedef struct{
 int key;
}element;
element stack[MAX_STACK_SIZE];
int top = -1;

//스택으로의 삽입함수
void add(int* top, element item)
{
 //전역 stack에 item을 삽입
 if(*top>=MAX_STACK_SIZE-1){
  stack_full();
  return ;
 }
 stack[++*top] = item;
}
//스택으로부터 삭제함수
element delete(int *top)
{
 if(*top == -1)
  return stack_empty();
 return stack[(*top)--];
}

/*-------------------------------------------------------------------------------*/
typedef enum {
 lparen, rparen, plus, minus, times, divide, mod, eos, operand
}percedence;
int stack[MAX_STACK_SIZE];
char expr[MAX_EXPR_SIZE];

//후위표기식 함수
int eval()
{/*전역 변수로 되어있는 후위표기식 expr을 연산한다.\0은 수식의 끝을 나타낸다.stack과top은 전역변수이다
 함수get_token은 토큰의 타입과 문자 심벌을 반환한다.피연산자는 한 문자로 된 숫자임을 가정한다.*/
 precedence token;
 char symbol;
 int op1,op2;
 int n=0; //수식 문자열을 위한 카운터
 int top = -1;
 token = get_token(&symbol,&n);
 while(token !=eos){
  if(token == operand)
   add(&top,symbol- '0'); //스택삽입
  else{
   op2=delete(&top); //스택삭제,삭제하면서 그자리에 있던값을 반환.
   op1=delete(&top); //스택삭제
   switch(token){
    case plus: add(&top,op1+op2); break;
    case minus: add(&top,op1-op2); break;
    case times: add(&top,op1*op2); break;
    case divide: add(&top,op1/op2); break;
    case mod: add(&top,op1%op2); break;
   }
  }
  token = get_token(&symbol,&n)
 }
 return delete(&top);//결과를 반환
}

precedence get_token(char* symbol, int* n)
{/*다음 토큰을 취한다. symbol은 문자표현이며 token은 그것의 열거된 값으로 표현되고 명칭으로 반환된다*/
 *symbol = expr[(*n)++];
 switch(*symbol){
  case '(' :return lparen;
  case ')' :return rparen;
  case '+' :return plus;
  case '-' :return miuns;
  case '/' :return divide;
  case '*' :return times;
  case '%' :return mod;
  case '\0':return eos;
  default  :return operand;//오류검사는 하지 않고 기본값은 피연산자
 }
}


블로그 이미지

百見 이 不如一打 요 , 百打 가 不如一作 이다.

,
stack

Last In First Out(후입 선출의 형태)


#define MAX_STACK_SIZE 100
typedef struct{
           int key;
}element;

element stack[MAX_STACK_SIZE];
int top = -1;
로 정의 되어있을때.

stack에로의 삽입 함수
void add(int* top,element item)
{/*전역스택에 item을 삽입*/
  if(*top>=MAX_STACK_SIZE-1){
   stack_full()'
   return;
}
 stack[++*top];
}

stack으로부터 삭제 함수
element delete(int* top)
{
   if(*top == 1)
   return stack_empty(); //오류키를 반환
 return stack[(*top)--];
}

설명: 스택으로 삽입 할때는 스택을 하나증가시킨후 삽입
        삭제시는 나중에 들어간 item을 빼낸후 스택을 하나 감소 시킨다.

일반적인 배열스택프로그램



동적연결된 스택(linked list로 구현된 스택)

#define MAX_STACKS 10
typedef struct
{
 int key;
}element;
typedef struct stack* stack_pointer;
typedef struct stack{
 element item;
 stack_pointer link;
};
stack_pointer top[MAX_STACKS];



삽입 함수

void add(stack_pointer *top,element item)
{//스택의 top에 원소를 삽입
 stack_pointer temp=(stack_pointer)malloc(sizeof(stack)); //메모리동적할당
 if(IS_FULL(temp)){
  fprintf(stderr,"메모리풀\n");
  exit(1);
 }
 temp->item=item;
 temp->link=*top;
 *top=temp;
}

삭제함수

element delete(stack_pointer,element item)
{//스택으로부터 원소를 삭제
 stack_pointr temp=*top;
 element item;
 if(IS_EMPTY(temp)){
  fprintf(stderr,"스텍이 비었음\n");
  exit(1);
 }
 item=temp->item;
 *top=temp->link;
 free(temp); // 메모리반환
 return item;
}

연결된 스택 프로그램
블로그 이미지

百見 이 不如一打 요 , 百打 가 不如一作 이다.

,