2016-11-12 72 views
0

輸入是一個數學表達式(例如1 + 2 + 3/4 * 5。或((1 + 2)+3)/ 4)* 5。 ...)帶點'。'作爲輸入的結束。檢查數組中的元素

我必須寫的算法確定該表達式被寫入正確以下一些算術規則:

-all括號必須關閉

- 兩個運營商不能站在旁邊彼此(例如,2 ++ 2)

- 兩個數字不能站近彼此(例如12 + 2)

-there是沒有 '*' 的數和一個括號(例如2之間(2 + 2) * 3)

- 僅限數字,運算符和三種括號可以使用

- 圓括號之間不能有空格(例如, ())

我幾乎把它們都覆蓋了但我只是不知道如何讓算法認識到這個例子是錯誤的: 9 + 6/5 *(1 + [2 + 3) ]。 - 括號的順序混合在一起

#include <stdio.h> 
#include <stdlib.h> 
#define MAX 100 

int main() 
{ 
    char expression[MAX]; 
    int i, j, parenthesisNr = 0, mistake = 0, tmpOp; 

    for (i = 0; i < MAX; i++){ 

     scanf("%c", &expression[i]); 

     if (expression[i] < '(' || expression[i] > '9'){ 
      if (expression[i] != '[' && expression[i] != ']' && expression[i] != '{' && expression[i] != '}') 
       mistake ++; 
     } 
     else if (expression[i] == '.'){ 
      break; 
     } 

    } 

    for (i = 0; i < MAX; i++){ 

     if (expression[i] == '(' || expression[i] == ')'){ 
      parenthesisNr ++; 
     } 

     if (expression[i] == '*' || expression[i] == '+' || expression[i] == '/' || expression[i] == '-'){ 
      tmpOp = expression[i]; 

      for (j = i + 1; j < i+2; j++){ 

       if (expression[j] == tmpOp){ 
        mistake ++; 
       } 
      } 
     } 

     if (expression[i] >= '0' && expression[i] <= '9'){ 

      for (j = i + 1; j < i + 2; j++){ 

       if (expression[j] == '(' || expression[j] == '[' || expression[j] == '{' || (expression[j] >= '0' && expression[j] <= '9')){ 
        mistake ++; 
       } 
      } 
     } 
    } 

    if (parenthesisNr % 2 == 1){ 
     printf ("WRONG"); 
    } 

    else if (mistake > 0){ 
     printf ("WRONG"); 
    } 

    else{ 
     printf ("CORRECT"); 
    } 

    return 0; 
} 
+0

如您在[上一個問題](http://stackoverflow.com/a/40561977/4142924)中通過使用堆棧回答,以匹配對。 –

回答

0

處理括號檢查的最簡單方法是使用堆棧。

要檢查「圓括號」或「括號」的不同樣式,請將圓括號插入堆棧。當你遇到一個關閉的括號彈出堆棧並檢查彈出的開括號是否與關閉的括號相匹配。

+0

我們還沒有學會關於堆棧,所以我認爲有一個選擇。儘管我自己會查看它。 只有一個問題,因爲我還不熟悉編程,是我寫的任何好的代碼? :) –