四则运算表达式由运算数(必定包含数字
,可能包含正或负符号
、小数点
)、运算符(包括+
、-
、*
、/
)以及小括号((
和)
)组成,每个运算数、运算符和括号都是一个token(标记)。现在,对于给定的一个四则运算表达式,请把她的每个token切分出来。题目保证给定的表达式是正确的,不需要做有效性检查。
输入格式:
在一行中给出长度不超过40个字符的表达式,其中没有空格,仅由上文中token的字符组成
输出格式:
依次输出表达式中的tokens,每个token占一行。
输入样例:
32*((2-2)+5)/(-15)
输出样例:
32
*
(
(
2
-
2
)
+
5
)
/
(
-15
)
分析:
重点是判断+和-到底是正负号还是运算符。当+/-前面和后面都是数字的时候它是运算符,如果前面是')'或者后面是'('代表是数字的运算结果,也为数字,需要注意这点,否则就是正负号。还有一点就是输出数字的时候需要判断下一位字符是什么,是否应该输出换行符。
#include<iostream>
using namespace std;
// 1 represents operator
int judge(string str, int k){
if(k - 1 >= 0 && str[k - 1] == ')') return 1;
if(k + 1 < str.length() && str[k + 1] == '(') return 1;
if(k - 1 >= 0 && str[k - 1] >= '0' && str[k - 1] <= '9'
&& k + 1 < str.length() && str[k + 1] >= '0' && str[k + 1] <= '9'){
return 1;
}
return 0;
}
int main(){
string str;
cin >> str;
for(int i = 0; i < str.length(); i++){
if(str[i] == '(' || str[i] == ')' || str[i] == '*' || str[i] == '/'){
cout << str[i] << endl;
}else if(str[i] == '+' || str[i] == '-'){
if(judge(str, i)) cout << str[i] << endl; //operator + -
else cout << str[i];
}else{
//number .
cout << str[i];
if(i + 1 < str.length()){
if(str[i + 1] == '(' || str[i + 1] == ')' || str[i + 1] == '*' || str[i + 1] == '/'){
cout << endl;
}else if(str[i + 1] == '+' || str[i + 1] == '-'){
if(judge(str, i + 1)) cout << endl;
}
}
}
}
return 0;
}