Skip to content

Commit 41467c1

Browse files
author
冷漠
committed
增加了对加减乘除的拆括号
1 parent 89b163b commit 41467c1

7 files changed

Lines changed: 66 additions & 5 deletions

File tree

SCMath.pro

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ SOURCES += \
1010
funinterface.cpp \
1111
scope.cpp \
1212
output.cpp \
13-
copynode.cpp
13+
copynode.cpp \
14+
scmath.cpp
1415

1516
HEADERS += \
1617
ast.h \
@@ -19,4 +20,5 @@ HEADERS += \
1920
funinterface.h \
2021
output.h \
2122
excep.h \
22-
marco.h
23+
marco.h \
24+
scmath.h

SCMath.pro.user

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<!DOCTYPE QtCreatorProject>
3-
<!-- Written by QtCreator 4.5.0, 2018-11-04T12:56:21. -->
3+
<!-- Written by QtCreator 4.5.0, 2019-02-15T12:44:16. -->
44
<qtcreator>
55
<data>
66
<variable>EnvironmentId</variable>

ast.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ bool ast::canpush(stack<string> &stackOp, string op)
5757

5858
BasicNode* ast::__ToAST(string &s)
5959
{
60-
//冷漠:因为偷懒,没有略过输入的空格,输入带有空格会扔异常
6160
s += '$';
6261
stack<BasicNode*> stackAST;
6362
stack<string> stackOp;

ast.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#pragma once
1+
#pragma once
22
#include<stack>
33
#include<string>
44
#include<cstdlib>

main.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,27 @@
22
#include <string>
33
#include "ast.h"
44
#include "output.h"
5+
#include "scmath.h"
56

67
using namespace std;
78

89
int main()
910
{
11+
/*
1012
string s = "1+2-3*4/5*(7+8-b)+sin(0)+a + 2 ^ 5 ";
1113
BasicNode* ans = ast::ToAST(s);
1214
output::outputAST(ans);
1315
cout << endl;
1416
output::outputAST(ans ->eval());
1517
cout << endl;
1618
output::outputAST(ans);
19+
*/
20+
string s ="(1+2)*(3+4)+(a+b)/(c+d)";
21+
BasicNode* ans = ast::ToAST(s);
22+
output::outputAST(ans);
23+
cout << endl;
24+
Simplificate(ans);
25+
output::outputAST(ans);
26+
cout << endl;
1727
return 0;
1828
}

scmath.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#include "scmath.h"
2+
3+
void Simplificate(BasicNode *&now){
4+
if(now->getType() != Fun)
5+
return;
6+
FunNode* tempNow = (FunNode*)now;
7+
if(tempNow->getEntity()->NAME == "*" || tempNow->getEntity()->NAME == "/"){
8+
if(tempNow->sonNode[0]->getType() == Fun){
9+
FunNode* temp = (FunNode*)(tempNow->sonNode[0]);
10+
if(temp->getEntity()->NAME == "+" || temp->getEntity()->NAME == "-"){
11+
FunNode* newls = new FunNode(tempNow->getEntity());
12+
newls->addNode(copyHelp::copyNode(temp->sonNode[0]));
13+
newls->addNode(copyHelp::copyNode(tempNow->sonNode[1]));
14+
FunNode* newrs = new FunNode(tempNow->getEntity());
15+
newrs->addNode(copyHelp::copyNode(temp->sonNode[1]));
16+
newrs->addNode(copyHelp::copyNode(tempNow->sonNode[1]));
17+
FunNode* newnow = new FunNode(temp->getEntity());
18+
newnow->addNode(newls);
19+
newnow->addNode(newrs);
20+
delete now;
21+
now = newnow;
22+
tempNow = (FunNode*)now;
23+
}
24+
}
25+
}
26+
if(tempNow->getEntity()->NAME == "*"){
27+
if(tempNow->sonNode[1]->getType() == Fun){
28+
FunNode* temp = (FunNode*)(tempNow->sonNode[1]);
29+
if(temp->getEntity()->NAME == "+" || temp->getEntity()->NAME == "-"){
30+
FunNode* newls = new FunNode(tempNow->getEntity());
31+
newls->addNode(copyHelp::copyNode(tempNow->sonNode[0]));
32+
newls->addNode(copyHelp::copyNode(temp->sonNode[0]));
33+
FunNode* newrs = new FunNode(tempNow->getEntity());
34+
newrs->addNode(copyHelp::copyNode(tempNow->sonNode[0]));
35+
newrs->addNode(copyHelp::copyNode(temp->sonNode[1]));
36+
FunNode* newnow = new FunNode(temp->getEntity());
37+
newnow->addNode(newls);
38+
newnow->addNode(newrs);
39+
delete now;
40+
now = newnow;
41+
}
42+
}
43+
}
44+
Simplificate(now->sonNode[0]);
45+
Simplificate(now->sonNode[1]);
46+
}

scmath.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#pragma once
2+
#include "nodetype.h"
3+
4+
void Simplificate(BasicNode *&now);

0 commit comments

Comments
 (0)