2012-11-27 26 views
1

美好的一天,我只是想知道如果有一種方法將其分解的數學表達式像一個字符串:算法破碎字符串算術表達式與符號數位

-2+-3+(4+5) 

預期的結果

-2 + -3 + (4 + 5) 

這個給定的字符串是使用空格分割的,我打算用這種方式來格式化這個表達式,因爲我必須用空格來分隔它。這不是我現在所關心的,我的目標是當我遇到像上面這個例子那樣的有符號數字時,而不是-2 + -3 + (4 + 5)這個,它看起來像這樣- 2 + - 3 + (4 + 5)

已經知道是什麼原因造成這一點,因爲我與

<whitespace> <operator> <whitespace> 

更換所有的跡象,但我怎麼排除籤位不象預期的結果進行分段?

注: 規劃是獨立的語言,因爲到現在爲止,我不知道該使用哪一個,該算法是比較重要的,但要更好地理解,Java的會做。

+0

什麼平臺? C#? JAVA? C? C++?哪一個?? –

+0

計劃成爲語言獨立,只是想知道算法,但JAVA將有所幫助 – lemoncodes

+0

'算法'! oh123 .. –

回答

0

通常這個任務是通過基於所謂的finite state machine的詞法分析器來解決的。

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 
} 
0

簡單的解決辦法是注意,-是一個二元運算符,只有當它遵循的東西,看起來像一個值,而你的情況可以是一個數字或)。因此,如果您迭代令牌(其中令牌是運算符字符或一系列數字),並且只記得最後一個令牌是否爲值(數字或)),則可以始終決定是否放置空間在當前令牌之後。 (你也可以捕捉到一些語法錯誤。)