Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
桃浪十七丶
cpp-design-patterns
提交
473da2d5
C
cpp-design-patterns
项目概览
桃浪十七丶
/
cpp-design-patterns
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
cpp-design-patterns
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
473da2d5
编写于
10月 06, 2018
作者:
L
liu-jianhao
提交者:
GitHub
10月 06, 2018
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add files via upload
上级
840c5eb5
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
136 addition
and
0 deletion
+136
-0
Interpreter/main.cpp
Interpreter/main.cpp
+136
-0
未找到文件。
Interpreter/main.cpp
0 → 100644
浏览文件 @
473da2d5
#include <iostream>
#include <map>
#include <stack>
using
namespace
std
;
class
Expression
{
public:
virtual
int
interpreter
(
map
<
char
,
int
>
var
)
=
0
;
virtual
~
Expression
(){}
};
//变量表达式
class
VarExpression
:
public
Expression
{
char
key
;
public:
VarExpression
(
const
char
&
key
)
{
this
->
key
=
key
;
}
int
interpreter
(
map
<
char
,
int
>
var
)
override
{
return
var
[
key
];
}
};
//符号表达式
class
SymbolExpression
:
public
Expression
{
// 运算符左右两个参数
protected:
Expression
*
left
;
Expression
*
right
;
public:
SymbolExpression
(
Expression
*
left
,
Expression
*
right
)
:
left
(
left
),
right
(
right
){
}
};
//加法运算
class
AddExpression
:
public
SymbolExpression
{
public:
AddExpression
(
Expression
*
left
,
Expression
*
right
)
:
SymbolExpression
(
left
,
right
){
}
int
interpreter
(
map
<
char
,
int
>
var
)
override
{
return
left
->
interpreter
(
var
)
+
right
->
interpreter
(
var
);
}
};
//减法运算
class
SubExpression
:
public
SymbolExpression
{
public:
SubExpression
(
Expression
*
left
,
Expression
*
right
)
:
SymbolExpression
(
left
,
right
){
}
int
interpreter
(
map
<
char
,
int
>
var
)
override
{
return
left
->
interpreter
(
var
)
-
right
->
interpreter
(
var
);
}
};
Expression
*
analyse
(
string
expStr
)
{
stack
<
Expression
*>
expStack
;
Expression
*
left
=
nullptr
;
Expression
*
right
=
nullptr
;
for
(
int
i
=
0
;
i
<
expStr
.
size
();
i
++
)
{
switch
(
expStr
[
i
])
{
case
'+'
:
// 加法运算
left
=
expStack
.
top
();
right
=
new
VarExpression
(
expStr
[
++
i
]);
expStack
.
push
(
new
AddExpression
(
left
,
right
));
break
;
case
'-'
:
// 减法运算
left
=
expStack
.
top
();
right
=
new
VarExpression
(
expStr
[
++
i
]);
expStack
.
push
(
new
SubExpression
(
left
,
right
));
break
;
default:
// 变量表达式
expStack
.
push
(
new
VarExpression
(
expStr
[
i
]));
}
}
Expression
*
expression
=
expStack
.
top
();
return
expression
;
}
void
release
(
Expression
*
expression
){
//释放表达式树的节点内存...
}
int
main
(
int
argc
,
const
char
*
argv
[])
{
string
expStr
=
"a+b-c+d-e"
;
map
<
char
,
int
>
var
;
var
.
insert
(
make_pair
(
'a'
,
5
));
var
.
insert
(
make_pair
(
'b'
,
2
));
var
.
insert
(
make_pair
(
'c'
,
1
));
var
.
insert
(
make_pair
(
'd'
,
6
));
var
.
insert
(
make_pair
(
'e'
,
10
));
Expression
*
expression
=
analyse
(
expStr
);
int
result
=
expression
->
interpreter
(
var
);
cout
<<
result
<<
endl
;
release
(
expression
);
return
0
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录