pzz
C++博客
|
首页
|
发新随笔
|
发新文章
|
联系
|
聚合
|
管理
随笔:8 文章:35 评论:3 引用:0
校赛之编译器
这一题可以说是字符串的模拟题,而在当时思路没有很清晰的情况下,就马上开始敲键盘了,只是认为这一题不难,应该很快就可以解出来的,但是在编码过程中遇到了不少问题,这些问题直接影响了思维,加之现场的压力,后来就越来越乱了,呼呼。。以后要注意一定要思路清晰,在纸上可以模拟下问题的解决思路,必须的透彻,这是很重要的!
问题描述如下:
一开始给定一些变量以及相对应的值,以%%%结尾,最后给出一些表达式的值,然我们求表达式的值是多少,形式如:
aa = 34
bb = 45
cc = 56
%%%
aa + bb * cc
aa + bb - cc
-------------------------------------------------------------------------------------------------------------------
1
#include
<
iostream
>
2
#include
<
sstream
>
3
#include
<
string
>
4
#include
<
iterator
>
5
#include
<
map
>
6
#include
<
vector
>
7
using
namespace
std;
8
string
input;
9
map
<
string
,
int
>
my;
10
map
<
char
,
int
>
f;
11
vector
<
int
>
num;
12
vector
<
int
>
op;
13
void
init()
14
{
15
f[
'
+
'
]
=
1
;
16
f[
'
-
'
]
=
2
;
17
f[
'
*
'
]
=
3
;
18
f[
'
/
'
]
=
4
;
19
}
20
string
predeal(
string
s)
21
{
22
int
len
=
s.size();
23
for
(
int
i
=
0
;i
<
len;i
++
)
24
if
(s[i]
==
'
=
'
)
25
s[i]
=
'
'
;
26
return
s;
27
}
28
string
prevdeal2(
string
s)
29
{
30
int
len
=
s.size();
31
for
(
int
i
=
0
;i
<
len;i
++
)
32
if
(
!
isalnum(s[i])
&&
s[i]
!=
'
'
)
//
如果不是字符且不是空格
33
{
34
s[i]
=
f[s[i]]
+
'
0
'
;
35
}
36
return
s;
37
}
38
int
main()
39
{
40
string
s;
41
while
(getline(cin,s)
&&
s
!=
"
%%%
"
)
42
{
43
//
strlwr((char *)s.c_str());
44
input
=
predeal(s);
45
istringstream
in
(input);
46
string
op1;
//
操作数1
47
int
num1;
//
数值
48
in
>>
op1
>>
num1;
49
my[op1]
=
num1;
50
}
51
map
<
string
,
int
>
::iterator it;
52
init();
53
while
(getline(cin,s))
54
{
55
num.clear();
56
op.clear();
57
string
deal
=
prevdeal2(s);
58
string
ans;
59
int
len
=
s.size();
60
istringstream
in
(deal);
61
in
>>
ans;
62
num.push_back(my[ans]);
63
//
接着再读入一个字符和字符串
64
int
op1;
65
string
ans2;
66
while
(
in
>>
op1
>>
ans2)
67
{
68
if
(op1
==
3
)
69
{
70
num.back()
*=
my[ans2];
71
}
72
else
if
(op1
==
4
)
73
{
74
num.back()
*=
my[ans2];
75
}
76
else
if
(op1
==
1
||
op1
==
2
)
77
{
78
op.push_back(op1);
79
num.push_back(my[ans2]);
80
}
81
}
82
int
res
=
num[
0
];
83
for
(
int
i
=
0
;i
<
op.size();i
++
)
84
{
85
if
(op[i]
==
1
)
86
{
87
res
+=
num[i
+
1
];
88
}
89
else
if
(op[i]
==
2
)
90
{
91
res
-=
num[i
+
1
];
92
}
93
}
94
cout
<<
"
the ans is:
"
<<
res
<<
endl;
95
}
96
system(
"
pause
"
);
97
}
98
发表于 2012-05-07 18:36
pzz
阅读(182)
评论(0)
编辑
收藏
引用
所属分类:
字符串匹配
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
校赛之编译器
AC自动机
网站导航:
博客园
IT新闻
BlogJava
博问
Chat2DB
管理
<
2024年12月
>
日
一
二
三
四
五
六
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
给我留言
查看公开留言
查看私人留言
随笔分类
一些记录(4)
(rss)
一些算法思路(2)
(rss)
随笔档案
2013年2月 (1)
2012年5月 (7)
文章分类
ACM 搜索(1)
(rss)
ahstu_oj(2)
(rss)
c/c++(8)
(rss)
c++基本常识(1)
(rss)
linux嵌入式(5)
(rss)
linux系统下遇到的奇怪问题(1)
(rss)
oj题目思路(2)
(rss)
操作系统(1)
(rss)
成长记录
(rss)
读书(1)
(rss)
九度oj(1)
(rss)
庞果会英雄挑战赛(1)
(rss)
深入理解计算机系统札记
(rss)
树状数组(1)
(rss)
思维火花
(rss)
算法学习(1)
(rss)
网络流
(rss)
线段树
(rss)
杂感
(rss)
状态dp
(rss)
字符串匹配(2)
(rss)
文章档案
2014年5月 (3)
2014年4月 (1)
2014年3月 (1)
2014年2月 (1)
2013年11月 (1)
2013年10月 (3)
2013年9月 (2)
2013年8月 (6)
2013年7月 (4)
2013年6月 (2)
2012年5月 (3)
2012年4月 (4)
2012年3月 (4)
友情链接
csdn
豆瓣
杭电酷行天下
老赵
刘若鹏
南阳c小加
搜索
最新评论
1. re: 树状数组和线段树简单题
。。。
--pzz
2. re: 2013我有梦
恩,是的
--pzz
3. re: 2013我有梦[未登录]
支持一吧!实践梦想需要极大的努力
--true
阅读排行榜
1. 2013我有梦(376)
2. nyoj195_飞翔(255)
3. hfut1245_水晶球(253)
4. 熟练才是王道 (251)
5. 群赛(222)
评论排行榜
1. 2013我有梦(2)
2. 熟练才是王道 (0)
3. nyoj195_飞翔(0)
4. 教训(0)
5. 群赛(0)