표현 식 값 구하 기, 창고 의 응용 (C 언어)
5925 단어 창고.데이터 구조표현 식 값 구하 기
제목: 스 택 을 이용 하여 표현 식 값 을 구 하 는 프로그램 을 작성 합 니 다. "+", "-", "*", "/" 네 가지 연산 을 포함 하 는 표현 식 을 입력 하 십시오. 그 중에서 음 수 는 (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;
이거 하고 나 니까 좋다.때때로 약간의 실 수 는 정말 의외 야!자신의 머리 를 컴 파일 러 로 단련 해 야 신 이 되 겠 지 ~!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
centos yum 창고 구축yum 창고 소개 yum (모두 Yellow dog Updater, Modified 라 고 함) 은 Fedora 와 RedHat 에 있 는 Shell 전단 패키지 관리자 입 니 다.RPM 패키지 관 리 를 바탕 으로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.