당신들 이 원 하 는 접미사 표현 식 트 리
사고, 접두사 표현 식 은 좋 은 공 입 니 다. 나 무 를 만 든 후에 바로 중간 순서 로 옮 겨 다 니 면 됩 니 다. 그 다음 에 가장 바깥쪽 괄호 를 없 애고 string 으로 쉽게 실현 할 수 있 습 니 다. 어 려 운 점 은 값 을 구 하 는 것 입 니 다. 문제 의 수치 가 0 보다 크 면 10 보다 작 기 때문에 두 자리 가 나타 날 수 있 습 니 다. 그래서 char 로 수치 와 계산 기 호 를 저장 할 수 있 습 니 다. 이번 실현 은 flag 를 통 해 연산 자 여 부 를 판단 할 수 있 습 니 다.따라서 코드 가 많 기 때문에 수치 도 char 에 저장 할 수 있 습 니 다. 여기 서 설명 하지 않 습 니 다.
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
#include
using namespace std;
const int MaxN = 36;
int N;
struct node {
int data;
bool sign;
char s;
int lchild;
int rchild;
node() { rchild = lchild = -1; sign = false; }
}Node[MaxN];
bool isRoot[MaxN];
string res;
string IntToStr(int num) {
string str;
while (num) {
str.insert(str.begin(),num % 10 + '0');
num /= 10;
}
if (!str.size()) return "0";
return str;
}
double post(int root) {
if (-1 == root) return 0;
bool flag = (Node[root].lchild != -1 || Node[root].rchild != -1);
if (flag) res += "(";
double leftv = post(Node[root].lchild);
if (Node[root].sign) res += Node[root].s;
else res += IntToStr(Node[root].data);
double rightv = post(Node[root].rchild);
if (flag) res += ")";
if (!Node[root].sign) return Node[root].data;
else {
switch (Node[root].s)
{
case '+':return leftv + rightv;
case '-':return leftv - rightv;
case '*':return leftv * rightv;
case '/':return leftv / rightv;
default:
return 0;
}
}
}
int main() {
#ifdef _DEBUG
freopen("data.txt", "r+", stdin);
#endif // _DEBUG
std::ios::sync_with_stdio(false);
stringstream ss; string str; int idx = 0;
cin >> N; cin.get(); getline(cin, str); ss << str;
for (int i = 0; i < N; ++i) {
if ('0' <= str[idx] && str[i] <= '9') {
ss >> Node[i].data;
}
else {
char ch;
ss >> ch;
Node[i].s = ch;
Node[i].sign = true;
}
while (idx < str.size()-1 && str[idx] != ' ')++idx;
if (idx < str.size() - 1) ++idx;
}
memset(isRoot, 1, N + 1);
for (int i = 0; i < N; ++i) {
ss.clear(); ss.str("");
getline(cin, str); ss << str;
int idx = 0, lc, rc;
if (str[idx] == '-') {
ss.get();
++idx;
}
else {
ss >> Node[i].lchild;
isRoot[Node[i].lchild] = false;
}
while (str[idx] != ' ')++idx;
++idx;
if (str[idx] != '-') {
ss >> Node[i].rchild;
isRoot[Node[i].rchild] = false;
}
}
int root = 0;
while (!isRoot[root])++root;
double val = post(root);
if (res.size() >= 3) {
res.erase(res.begin());
res.erase(res.end()-1);
}
cout << res << " " ;
cout << setiosflags(ios::fixed) << setprecision(2) << val;
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
08.Const / Void텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.