표현 식 값 구하 기, 창고 의 응용 (C 언어)

어이 가 없어 죽 겠 는데, 다행히 마침내 해 냈 다.
제목: 스 택 을 이용 하여 표현 식 값 을 구 하 는 프로그램 을 작성 합 니 다. "+", "-", "*", "/" 네 가지 연산 을 포함 하 는 표현 식 을 입력 하 십시오. 그 중에서 음 수 는 (0 - 정수) 로 표시 하고 = 으로 끝 납 니 다.출력 식 의 값 을 요구 합 니 다 (두 연산 기호의 유한 관 계 는 교재 표 3.1 참조).
테스트 스타일:
[1 조 자체 측정 데이터]
[키보드 입력]
3*(9-7)#↙
[올 바른 출력]
6
[2 조 자체 측정 데이터]
[키보드 입력]
(0-12)*((5-3)*3)/(2+2)=
[올 바른 출력]
-18
전체 코드
typedef int Status; 
typedef char SElemType;
typedef double SElemType2;
#include"malloc.h" 
#include"stdio.h"
#include"math.h"
#include"stdlib.h"
#include"string.h"
#define OK              1
#define ERROR           0
#define TRUE            1
#define FALSE           0
#define STACK_INIT_SIZE 10 //         
#define STACKINCREMENT  2  //        

///////////////////////////////////////////////////////////////
//gets     ,       【   】 【   】  。	   
//        ,    【   】,     【   】。	   
//【    】 char  ,【    】 double  。			   
//  ,   ,          ,              。
///////////////////////////////////////////////////////////////

struct SqStack       //     
{
	SElemType * base;
	SElemType * top;
	int stacksize;
};

struct SqStack2		 //     
{
	SElemType2 * base;
	SElemType2 * top;
	int stacksize;
};

Status InitStack(SqStack &S)   //          
{
	S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
	if(!S.base) exit(-2);
	S.top = S.base;
	S.stacksize = STACK_INIT_SIZE;
	return OK;
}

Status InitStack2(SqStack2 &S)  //          
{
	S.base = (SElemType2 *)malloc(STACK_INIT_SIZE * sizeof(SElemType2));
	if(!S.base) exit(-2);
	S.top = S.base;
	S.stacksize = STACK_INIT_SIZE;
	return OK;
}

Status Push(SqStack &S, SElemType e)  //         
{
	if(S.top - S.base >= S.stacksize)
	{
		S.base = (SElemType *)realloc(S.base,(S.stacksize + STACKINCREMENT) * sizeof (SElemType));
		if(!S.base) exit(-2);
		S.top = S.base + S.stacksize;
		S.stacksize += STACKINCREMENT;
	}
	* S.top = e;
	S.top ++;
	return OK;
}

Status Push2(SqStack2 &S, SElemType2 e)  //         
{
	if(S.top - S.base >= S.stacksize)
	{
		S.base = (SElemType2 *)realloc(S.base,(S.stacksize + STACKINCREMENT) * sizeof (SElemType2));
		if(!S.base) exit(-2);
		S.top = S.base + S.stacksize;
		S.stacksize += STACKINCREMENT;
	}
	* S.top = e;
	S.top ++;
	return OK;
}

Status In(char c)   //        ,        TRUE,      FALSE
{
	if(c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')' || c == '=') return TRUE;
	else return FALSE;
}

SElemType GetTop(SqStack S)  //           
{
	SElemType *p;
	p = S.top;
	p--;
	if(S.base == S.top) return ERROR;
	return(*p);
}

SElemType2 GetTop2(SqStack2 S)  //           
{
	SElemType2 *p;
	if(S.base == S.top) return ERROR;
	p = S.top;
	p--;
	return(*p);
}

Status Pop(SqStack &S, SElemType &e)  //         
{
	if(S.top == S.base) return ERROR;
	S.top --;
	e = * S.top;
	return OK;
}

Status Pop2(SqStack2 &S, SElemType2 &e)	//         
{
	if(S.top == S.base) return ERROR;
	S.top --;
	e = * S.top;
	return OK;
}


//             op1         op2          
//      ,            ,      
SElemType Precede(SElemType op1, SElemType op2)	
{												
	switch(op1)
	{
		case '+':if(op2 == '+' || op2 == '-' || op2 == ')' || op2 == '=') return ('>');
				 else return ('');
				 else return (''); break;
		case '/':if(op2 == '(') return (''); break;
		case '(':if(op2 == ')') return ('=');
				 else return (''); break;
		case '=':if(op2 == '=') return ('=');
			     else return ('':Pop(OPTR, theta);//           ,  Operate  ,        
						 Pop2(OPND, b); Pop2(OPND, a);
						 Push2(OPND, Operate(a, theta, b)); 
						 break;
			}

	}
	return GetTop2(OPND);
}

int main(void)
{
	printf("%g
",EvaluateExpression()); return 0; }

실행 결과 캡 처:
[노트]
        if(!In(*p))            //  p             
        {                        
            TempData[i] = *p;  //          ,   TempData  
            p++;               //       
            ++i;                 
            if(In(*p))                //         
            {  
                TempData[i] = '\0';   //    TempData               
                Data=atof(TempData);  //atof     :               Data    
                Push2(OPND, Data);    // Data    
                i = 0;                //    
            }  
        }  

아파 죽 겠 어, 처음에는 이 줄 을 쓰 지 않 았 어.시간 이 지난 입력 형식 을 찾 았 습 니 다.   한 자릿수 (연산 자) 두 자릿수 =  때 는 모두 틀 리 지 않 지만, 일단 거꾸로 되면  두 자릿수 (연산 자) 한 자릿수 = 틀 릴 수 있다.
예 를 들 어 12 - 3 = 결 과 는 - 20 이다.393 - 10 = 결과 만 29.
한 번 자세히 연구 해 보 니, 원인 은 정말 아버 지 를 너무 속 이 는 것 이다.
예 를 들다.
gets(MyExpression);
MyExpression =
3
9
3
-
1
=
\0
\0
\0

포인터 p 는 첫 번 째, 즉 '3' 을 가리 키 고 p 가 가리 킬 때 까지 TempD 에 저장 합 니 다.  '-'  ,
TempData =
3
9
3
\0
\0
\0
\0
\0
\0
\0
그리고 data = atof (TempData)  즉 data = 393;
이때 첫 번 째 숫자 393 이 바 뀌 었 고 저장 이 끝 났 습 니 다.
이어서 문자 '1' 을 바 꾸 기 시작 했다.
그런데 여기 가 틀 렸 어!
p 지향 1, TempData = 
1
9
3
\0
\0
\0
\0
\0
\0
\0
그리고!그리고 바로 아 토 프.
그래서 이때 data = 193
이어서 연산 하면 393 - 1 이 393 - 193 이 됩 니 다!
구 하 는 방법 은 간단 해!p 가 숫자 다음 지향 연산 자 를 가리 킬 때마다 TempData 에 저 장 된 숫자 뒤에 바로 끝 문자 '\ 0' 을 저장 합 니 다.
이때 p 는 '=' 을 가리 키 는 동시에 TempData =
1
\0
3
\0
\0
\0
\0
\0
\0
\0
그래서 아 토 프 는 이런 상황 에서 당연히 첫 번 째 '\ 0' 이전의 숫자 만 신경 쓰 지!
자연, Data = 1;
이거 하고 나 니까 좋다.때때로 약간의 실 수 는 정말 의외 야!자신의 머리 를 컴 파일 러 로 단련 해 야 신 이 되 겠 지 ~!

좋은 웹페이지 즐겨찾기