산술 식
+, -, *, / 만 포함 하 는 비 마이너스 정수 계산 표현 식 을 읽 고 이 표현 식 의 값 을 계산 합 니 다.
입력:
테스트 입력 은 몇 가지 테스트 사례 를 포함 하고 모든 테스트 사례 는 한 줄 을 차지 하 며 줄 당 200 자 를 초과 하지 않 으 며 정수 와 연산 자 사이 에 빈 칸 으로 구분 합 니 다.불법 표현 식 이 없습니다.한 줄 에 0 만 있 을 때 입력 이 끝나 면 해당 결 과 는 출력 하지 마 십시오.
출력:
각 테스트 용례 에 대해 1 줄, 즉 이 표현 식 의 값 을 소수점 뒤의 2 자리 까지 정확하게 출력 합 니 다.
샘플 입력:
1 + 2
4 + 2 * 5 - 7 / 11
0 샘플 출력:
3.00
13.36 생각:
창고, 접미사 표현 식.
접미사 식 - > 접미사 식: 스 택 의 조작 자 는 스 택 꼭대기 에서 스 택 밑 까지 엄 격 히 감소 합 니 다 (즉, push 에서 기호 스 택 까지 의 기 호 는 스 택 꼭대기 기호 보다 우선 순위 가 높 을 것 입 니 다. 그렇지 않 으 면 pop)
#include "iostream"
#include "stdio.h"
#include "math.h"
#include "vector"
#include "stack"
#include "queue"
#include "memory.h"
#include "algorithm"
#include "string"
using namespace std;
char e[250],post[250];
stack<char>Op;
bool Isnum(char c)
{
if(c>='0'&&c<='9')
return true;
return false;
}
int OPMode(char c)
{
if(c=='+') return 1;
if(c=='-') return 2;
if(c=='*') return 3;
if(c=='/') return 4;
return -1;
}
void SplitExp(char* s)
{
int i,j=0;
memset(post,'\0',sizeof(post));
for(i=0;i<strlen(s);i++)
{
if(s[i]==' ')
continue;
post[j++]=' ';
while(Isnum(s[i]))
post[j++]=s[i++];
int curop=OPMode(s[i]);
if(curop!=-1)
{
if(curop<=2)
while(!Op.empty())
{
post[j++]=Op.top();
Op.pop();
}
else
{
while(!Op.empty()&&OPMode(Op.top())>2)
{
post[j++]=Op.top();
Op.pop();
}
}
Op.push(s[i]) ;
}
}
while(!Op.empty())
{
post[j++]=Op.top();
Op.pop();
}
}
stack<double>Num;
double Cal()
{
while(!Num.empty())
Num.pop();
int i=0,j;
int len=strlen(post);
while (i++<len)
{
if(post[i]==' ')
continue;
double cur=0;
bool hasnum=false;
while (Isnum(post[i]))
{
cur*=10;
cur+=post[i++]-'0';
hasnum=true;
}
if(hasnum)
Num.push(cur);
if(OPMode(post[i])!=-1)
{
double num1=Num.top();
Num.pop();
double num2=Num.top();
Num.pop();
switch(post[i])
{
case '+': Num.push(num2+num1);break;
case '-': Num.push(num2-num1);break;
case '*': Num.push(num2*num1);break;
case '/': Num.push(num2/num1);break;
}
}
}
return Num.top();
}
int main()
{
while(gets(e))
{
if(strcmp(e,"0")==0)
break;
SplitExp(e);
printf("%.2f
",Cal());
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.