XDOJ 492 切分表达式

题面

问题描述

四则运算表达式由运算数(必定包含数字,可能包含正或负符号、小数点)、运算符(包 括+、-、*、/)以及小括号((和))组成,每个运算数、运算符和括号都是一个 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

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bbw20110110

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值