3*3/2+7 뭐 이런식으로 문자열로 한번 입력받아서 우선순위 지키면서 결과 출력하려하는데 대강 해본 생각은 strlen만큼 루프돌면서 buf[i]에 연산자 있으면 비교해서 우선순위같은거 저장해놓고 어케 하면 될거같은데 맞음?
댓글 21
생각한걸 해보고 안되면 바꿔서 해보고 반복 = 삽질
Douner(douner6)2015-07-01 01:45
스택이나 재귀 호출을 이용해서, 값 + 연산자1 + 값 + 연산자2 를 읽어서 연산자2가 연산자1보다 우선순위가 높으면 (값 + 연산자2 + ...) 부분을 먼저 처리하고, (값 + 연산자1) 은 잠시 스택에 push. 그렇지 않으면 (값 + 연산자1 + 값) = 값2를 계산하고 같은 방식으로 값2 + 연산자2 + 값 + 연산자3 에 대해서 반복. 하면 됨.
ㅅㅅㅅ(221.145)2015-07-01 01:45
만일 연산자2 = 수식의 끝이면 바로 연산하면 되고.
ㅅㅅㅅ(221.145)2015-07-01 01:46
파서에 대한 지식이 있으면 쉬워. 물론 파서에 대한 지식 없이 맨 땅에 헤딩하는 식으로 만들려고 하면 좀 힘들 거고. 스택을 쓴다는 지식이라도 있으면 알고리즘 떠올리는 데 적잖은 힌트가 될 거야.
생각한걸 해보고 안되면 바꿔서 해보고 반복 = 삽질
스택이나 재귀 호출을 이용해서, 값 + 연산자1 + 값 + 연산자2 를 읽어서 연산자2가 연산자1보다 우선순위가 높으면 (값 + 연산자2 + ...) 부분을 먼저 처리하고, (값 + 연산자1) 은 잠시 스택에 push. 그렇지 않으면 (값 + 연산자1 + 값) = 값2를 계산하고 같은 방식으로 값2 + 연산자2 + 값 + 연산자3 에 대해서 반복. 하면 됨.
만일 연산자2 = 수식의 끝이면 바로 연산하면 되고.
파서에 대한 지식이 있으면 쉬워. 물론 파서에 대한 지식 없이 맨 땅에 헤딩하는 식으로 만들려고 하면 좀 힘들 거고. 스택을 쓴다는 지식이라도 있으면 알고리즘 떠올리는 데 적잖은 힌트가 될 거야.
스택을 쓴다는게 어셈으로 짜란 뜻인가염
아님 걍 변수에 박아두란뜻?
"스택" 자료구조 쓰라는 거지.
스택, 큐 같은 자료구조 말야. 스택 메모리 말고.
흠 멘땅에 헤딩이 되겠군염
꼴렸읍니다
http://ideone.com/SEFwWU
간단하게 덧셈과 곱셈, 그리고 숫자는 한 글자만 입력받을 수 있게끔 해 본 계산기야.
nextval()은 다음 숫자, nextop()은 다음 연산자를 읽는 함수.
calculate(nextval(), nextop(), nextval(), nextop()); 식으로 호출하니깐 프로그램이 이상하게 돌아가서 버그 잡느라 시간 걸림 ㅡㅡ; 함수 호출 시 인자 푸시는 반대로 하는 걸 깜빡 잊어버려서...
저거 calculate 함수에서 연산자 우선순위 판정 부분만 잘 짜면 +, -, *, /, ^, ... 얼마든지 연산자 추가시킬 수 있다. 좀 심화시켜서 괄호도 지원할 수 있고.
http://ideone.com/B4EQoB
확장판 한번 만들어 봤다. +, -, *, /, ^(제곱), <(왼쪽 쉬프트), >(오른쪽 쉬프트), &(논리곱), |(논리합) 지원.
파이썬에선 [...] 한방이면 해결
exec함수가 스트링 받아서 그대로 계산해주는 함수 ㅋㅋ
ㄳㄳ
렉스 야크 ㅋㅋㅋㅌ
zaxczs // [...]는 명령문 실행이고. [...]을 써야 하겠지. [...]이 수식 값 계산.
재귀하강 파싱방법 써라 - DCW