Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 带符号数字的字符串算术表达式分段算法_String_Algorithm - Fatal编程技术网

String 带符号数字的字符串算术表达式分段算法

String 带符号数字的字符串算术表达式分段算法,string,algorithm,String,Algorithm,您好,我只是想知道是否有一种方法可以分割一个算术表达式字符串,如: -2+-3+(4+5) 进入预期结果 -2 + -3 + ( 4 + 5 ) 这个给定的字符串是用空格分割的,我打算用这种方式格式化这个表达式,因为我必须用空格来分隔它。这不是我现在所关心的,我的目标是,当我遇到一个有符号的数字,比如上面的例子,而不是-2+-3+(4+5)这个,它看起来像-2+-3+(4+5) 我已经知道是什么原因造成的,因为我正在用 <whitespace> <operator>

您好,我只是想知道是否有一种方法可以分割一个算术表达式字符串,如:

-2+-3+(4+5)
进入预期结果

-2 + -3 + ( 4 + 5 )
这个给定的字符串是用空格分割的,我打算用这种方式格式化这个表达式,因为我必须用空格来分隔它。这不是我现在所关心的,我的目标是,当我遇到一个有符号的数字,比如上面的例子,而不是
-2+-3+(4+5)
这个,它看起来像
-2+-3+(4+5)

我已经知道是什么原因造成的,因为我正在用

<whitespace> <operator> <whitespace>

但是如何排除带符号的数字,使其不会像预期的结果那样支离破碎

注意:
计划独立于语言,因为到目前为止,我不知道该使用哪一种,算法更重要,但为了更好地理解,Java会这样做。

通常这个任务是通过基于所谓

string s=“-2+-3+(4+5)”;
列表标记=新列表();
常数int ST_NONE=0,ST_减号=1,ST_位数=2,ST_点=3;
int j=0;//令牌启动
int st=st_NONE;//状态
对于(int i=0;i
简单的解决方案是注意,
-
仅当它跟在看起来像值的东西后面时才是二进制运算符,在您的例子中,它是数字或
。因此,如果您迭代令牌(其中一个令牌是运算符字符或一系列数字),并且只需记住最后一个令牌是否是值(数字或
),您始终可以决定是否在当前令牌后放置空格。(您还可以捕获一些语法错误。)

什么平台??C#?JAVACC++???哪一个?计划独立于语言,只是想知道算法,但JAVA会很有帮助这里的主要问题是如何在不影响签名数字的情况下分割此字符串请检查我的答案是否有用,如果需要更多帮助,请告诉我。
string s = "-2+-3+(4+5)";
List<string> tokens = new List<string>();
const int ST_NONE = 0, ST_MINUS = 1, ST_DIGITS = 2, ST_PUNCT = 3;
int j = 0; // token start
int st = ST_NONE; // state
for(int i = 0; i < s.Length(); ++i) {
    switch(s[i]) {
        case '0' .. '9':
            if (st != ST_NONE && st != ST_DIGITS) { // any prev token
                tokens.Add(s.SubStr(j, i - j)); // yield prev token
                j = i; // start of new token
            }
            st = ST_DIGITS; // note transition from ST_MINUS
            break;
        case '-': // special case since number can start with it
            if (st == ST_DIGITS) { // "4-" is definitely means "4 - .."
                tokens.Add(s.SubStr(j, i - j)); // yield prev number
                j = i, st = ST_PUNCT;
            }
            else if (st != ST_NONE) {
                tokens.Add(s.SubStr(j, i - j)); // yield prev token
                j = i, st = ST_MINUS;
            }
            else {
                j = i, st = ST_MINUS;
            }
            break;
        case '+': case '*': case '/': case '(': case ')':
            if (st != ST_NONE) { // any prev token
                tokens.Add(s.SubStr(j, i - j)); // yield prev token
                j = i;
            }
            st = ST_PUNCT;
            break;
        default:
            throw new UnexpectedCharacter();
    }
}
if (st != ST_NONE) { // any prev token
    tokens.Add(s.SubStr(j, i - j)); // yield prev token
}