야구를 좋아하는 프로그래머
홈
글쓰기
방명록
관리자
기말 프로젝트 - 토크나이저
Study/C++
2011. 9. 29. 20:31
#include
#include
#include
//c++에서 파일 입력 출력을 할수있게 한다 #include
//수학 연산함수 포함하는 헤더 using namespace std; //c++에서 쓰는이름공간 #define MAX 100 //스택의 최대 사이즈 #define RD(X) (X)*M_PI/180 //삼각 함수 구하는 공식 #define M_PI 3.141592 typedef enum {SIN, COS, TAN}; int stack[MAX]; //전역변수 stack[] 선언 int stack_top; //전역변수 stack_top 선언 void init_stack(void); //스택의 초기화 함수 char push(char t); //스택의 맨위에 자료 요소를 삽입한다 char pop(void); // 스택의 맨 위에 있는 자료 요소를 꺼낸다 int get_stack_top(void); // 스택의 top값을 얻어오는 함수 int is_stack_empty(void); // 스택이 비었는지 아닌지 확인한다 double precedence(int op); //수식 선행자와 연산자 사이를 확인한다 int is_pos(char *postfix); //후위식을 표현한다 void postfix(char *dst, char *src); //후위식을 불러오는 함수 double cal(char *post); //계산기 후위식의 표현 double is_operator(int op); //수식 연산자를 선언한다 bool is_numbers(char *op); // 소수점 리턴하는 함수 bool is_parenthesis(char *op); //괄호 리턴하는 함수 void token(char input[]); //토큰을 분리하는 함수 void main(int) //메인함수 { double result=0; //수식결과값 char exp[256]; //문자열로 exp와 infix의 크기 선정 char input[100]; //입력값의 크기를 잡아준다 cout<<"//======================================//"<
>input; //수식 입력 cout<<"//===============================//"<
=0 && (int)input[i+1]-'0'>=0) || ((int)input[i]-'0'>=0 && input[i+1]=='.') || (input[i]=='.' && (int)input[i+1]-'0'>=0)) { cout << input[i]; continue; } else if((int)input[i]-'0'>=0 && (int)input[i+1]-'0'<0) { cout << input[i] << endl; } else if((int)input[i]-'0'<0) { cout << input[i] << endl; } } //input한 값만큼 0을 빼서 그보다 크거나 같거나 작을때 일일히 하나씩 때어내서 출력한다 } void init_stack(void) // 스택 초기화 { stack_top = -1; } char push(char t) //push 함수 { if (stack_top >= MAX - 1) //스택탑이 맥스에서1을 뺸거보다 크거나 같을때 { cout<<"스택에서 오버플로우"<
= '0' && op[i] <= '9') continue; else if(op[i] == '.') continue; else return false; } return true; } double precedence(int op) //연산자의 우선순위 변환 { switch(op) { case'*': return 5; //곱하기연산 case '/': return 5; //나누기 연산 case '+': return 4; //더하기 연산 case '-': return 4; //빼기 연산 case 's': return SIN; case 'c': return COS; case 't': return TAN; } return 0; //리턴 } int is_pos(char *postfix) //후위식을 표현한다 { int result = 0; //결과값 초기화 while (*postfix) // 후위식포인터 반복문 { while (*postfix == ' ') //후위식표현할때 공간을 띄운다 postfix++; //후위식을 증가시킨다 if (is_operator(*postfix)) //만약에 연산자에 후위식이 들어갔을때 result--; //결과값은 감소한다 else //만약에 들어가지 않았을때 { result++; //결과값 증가한다 while (*postfix != ' ') //후위식표현할때 공간을 띄운다 postfix++; //후위식을 증가시킨다 } if (result < 1) break; //만약에 결과값이 1보다 작을때 postfix++; //후위식 증가 } return (result == 1); //결과값이 1일때 리턴한다 } void postfix(char *dst, char *src) //전위식을 후위식으로 바꾸면서 표현한다 { init_stack(); //스택에서 초기화한다 while (*src) { if (*src == '(') //(를 만나면 { push(*src); //스택에 push src++; //증가 } else if (*src == ')') //)를 만나면 스택나올때까지 pop { while (get_stack_top() != '(') //최상위스택값을 얻지못했을때 (를 초훌 { *dst++ = pop(); //스택에 pop *dst++ = ' '; //공간띠움 } pop(); //pop호출 src++; //증가 if ((get_stack_top() == 's') || (get_stack_top() == 'c') || (get_stack_top() == 't') ) { // 괄호가 끝이난후 삼각함수의 연산자가 들어 있는지 검사 *dst++ = pop(); // true일경우 팝 *dst++ = ' '; } else; } else if (is_operator(*src)) //연산자일때 { if ((get_stack_top() == 's') || (get_stack_top() == 'c') || (get_stack_top() == 't') ) {// 스택의 탑이 삼각함수인지 검사. 이유 괄호다음의 우선순위는 삼각함수이다. *dst++ = pop(); *dst++ = ' '; } while (!is_stack_empty() && precedence(get_stack_top()) >= precedence(*src)) { //그 자체보다 더 높은 우선순위 팝을 나타낸다 *dst++ = pop();//스택에 pop *dst++ = ' ';//공간띠움 } push(*src);//스택에 push src++;//증가 } else if (*src >= '0' && *src <= '9') //피연산자는 그냥 출력 { do { *dst++ = *src++; //숫자는 그냥 증가 } while (*src >= '0' && *src <= '9' && *src == '.'); *dst++ = ' '; } else if ( *src == '.' ) *dst++ = *src++; else if ( *src == 's' ) // sin을 만날경우 첫문자가 's'임으로 검사 { push(*src); src = src+3; // sin글씨 세게의 다음으로 이동 } else if ( *src == 'c' ) { push(*src); src = src+3; } else if ( *src == 't' ) { push(*src); src = src+3; } else src++; } while (!is_stack_empty()) //모두 끝났으면 스택에 있는 { *dst++ = pop(); //모든 내용을 pop *dst++ = ' '; } dst--; *dst = '\0'; } double cal(char *post) //계산기의 후위식표현 { int i; init_stack(); //스택 초기화 while (*post) { if (*post >= '0' && *post <= '9') //숫자로된 문자열 호출 { i = 0; do { i = i * 10 + *post - '0'; //숫자로 된 문자열을 숫자로 변환 post++; //하나씩 증가 } while (*post >= '0' && *post <= '9'); //피연산자 호출 push(i); //피연산자는 스택에 push } else if (*post == '+') //연산자를 만나면 { push(pop() + pop());//스택에서 pop하여 push post++; } else if (*post == '*') //연산자를 만나면 { push(pop() * pop()); //스택에서 pop하여 push post++; } else if (*post == '-') //교환법칙이 성립하지 않는다 { i = pop(); push(pop() - i); post++; } else if (*post == '/') //교환법칙이 성립하지 않는다 { i = pop(); push(pop() / i); post++; } else if ( (*post == SIN) || (*post == COS) || (*post == TAN) ) { *post = pop();//맨위의 숫자를 연산한다. switch (i) // 삼각함수 연산시 { case SIN : push(sin(RD(i))); break; case COS : push(cos(RD(i))); break; case TAN : push(tan(RD(i))); break; } } else post++; } return pop(); //마지막 연산 결과는 스택에 }
공유하기
게시글 관리
야구를 좋아하는 프로그래머
'
Study
>
C++
' 카테고리의 다른 글
볼링게임
(0)
2011.09.29
스택과 큐
(0)
2011.09.29
퍼즐게임
(0)
2011.09.29
tic tac toe 게임
(0)
2011.09.29
지뢰 찾기
(0)
2011.09.29
Posted by
코딩하는 야구쟁이
,
코딩하는 야구쟁이
카테고리
야구쟁이
(1239)
Life
(151)
일상
(15)
힐링
(53)
교훈
(6)
상식
(3)
게임
(9)
스포츠
(52)
웃자
(13)
터틀즈
(0)
Baseball #1
(179)
MLB
(75)
KBO
(23)
NPB
(30)
역사
(33)
컬럼
(16)
후기
(2)
Baseball #2
(55)
훈련
(26)
다큐
(15)
스케치
(7)
기록
(5)
복기
(2)
Music
(395)
국내
(274)
국외
(120)
Study
(459)
IT
(12)
포트폴리오
(2)
자기소개서
(6)
IPhone Tip
(29)
SoftWare
(9)
Oracle
(44)
X-CODE
(1)
XPlatform
(10)
Velocity
(3)
C++
(30)
C#
(75)
MFC
(18)
OpenCV
(20)
ASP.NET
(4)
Android
(1)
JAVA
(42)
JQuery
(1)
Spring
(4)
iBatis
(2)
JSP
(43)
Servlet
(3)
Java Script
(8)
HTML
(3)
OpenGL
(24)
NetWork
(2)
Server
(4)
xpressEngine
(0)
VRML
(15)
은행
(0)
경영학
(40)
수학
(4)
태그목록
프로그래밍
LA다저스
c++
Cortona 3D
KBO
MLB
vrml
opencv
김경호
db
이구리
OpenGL
태그를 입력해 주세요.
야구강좌
닷넷
메이저리그
3D 프로그래밍
클래스
부산맛집
나가수
야구역사
나는가수다
C#
스포츠
아이폰4
프로야구
신시내티
추신수
이슈
야구동영상
류현진
mfc
WWF
C언어
야구
불후의 명곡
데이터베이스
나는 가수다
G세대의 창업전략
HCI
최근에 올라온 글
최근에 달린 댓글
최근에 받은 트랙백
글 보관함
링크
Powerful Programming.
DaddyGom... is S/W D….
구름처럼 흘러가는 일상.....
부산시 공식블로그 Cooooool! ….
이구리의 음악블로그.
LOVE YOURSELF MORE.
자바캔(Java Can Do IT).
까먹지말자!.
야구로그.
막군의 홀로 사는 이야기!.
까칠한 쑤.
엑스플랫폼 101.
SIMPLE IS THE BEST!.
딸기향기의 휴식시간.
kini's Sportugese.
나이스 블로그.
'SUPER HD 스포츠' 아프리카T….
서면미용실 ,미가랑헤어.
박동희기자의 스포츠 춘추.
봉명동안방극장.
mdsloved_rb님의 블로그.
한스의 맛있는 이야기.
S.F.A.R의 MLB.
사회인야구장 운영 및 개발.
DIET STORY.
엠엘비 포스트.
Simple.
Total :
Today :
Yesterday :
티스토리툴바