题面
问题描述
四则运算表达式由运算数(必定包含数字,可能包含正或负符号、小数点)、运算符(包 括+、-、*、/)以及小括号((和))组成,每个运算数、运算符和括号都是一个 token(标记)。 现在,对于给定的一个四则运算表达式,请把式子中的每个 token 切分出来。题目保证给定 的表达式是正确的,不需要做有效性检查。
输入格式
在一行中给出长度不超过 40 个字符的表达式,其中没有空格,仅由上文中 token 的字符组成。
输出格式
依次输出表达式中的 tokens,每个 token 占一行。
样例输入
32*((2-2)+5)/(-15)
样例输出
32
*
(
(
2
-
2
)
+
5
)
/
(
-15
)
题解
这道题你放心,AI做不出来,AI在细节方面差的很远。
回到正题,本题难点在于意识到正负号与加减号的区别,以及注意考虑小数点。
所以本题的思路如下:
-
读取输入的一行字符串,并逐个字符进行判断。通过一个循环来遍历整个字符串。
-
对于每个字符,首先判断是否为加号或减号。如果是,根据前一个字符的类型来确定是正负号还是加减号。
-
如果当前字符不是加号或减号,进一步判断该字符是否为数字。如果是数字,则循环输出连续的数字字符,直到遇到非数字字符也非 . 号为止并换行。
-
如果当前字符既不是加号减号,也不是数字,则直接输出该字符并换行。
更详细的解释请看以下代码中的注释
#include <iostream>
#include <string>
using namespace std;
int pos; //pos表示当前判断字的符位置
int main()
{
string s;
getline(cin, s); // 用getline读取一整行字符串
while (pos < s.size())
{
if (s[pos] == '+' || s[pos] == '-') // 如果当前字符是 + 或者 -
{
if (pos == 0) // 表达式开头的 + 、 - 一定是正负号
{
cout << s[pos];
}
else // 前面一个字符是数字或者 ) ,则其是加号或者减号
{
if (s[pos - 1] >= '0' && s[pos - 1] <= '9' || s[pos - 1] == ')')
{
cout << s[pos] << '\n';
}
else // 反之则是正负号
{
cout << s[pos];
}
}
}
else if (s[pos] > '9' || s[pos] < '0') //当前字符不是数字或者加号减号
{
cout << s[pos] << '\n'; //这是一个token,输出它并换行
}
else // 当前字符是数字
{
do{
cout << s[pos++]; //直接输出,pos指向下一位
}while (s[pos] >= '0' && s[pos] <= '9' || s[pos] == '.'); // 如果下一位还是数字字符则继续循环
// 跳出循环,不是数字字符了,意味着这一整个数的token结束
cout << '\n'; // 那就换行
continue; // 这里微操,在循环里操作位已经多向后了一位,直接进行下一次循环
}
pos++; //把判断位置指向下一位
}
return 0;
}
date:20240102