2012-08-15 56 views
0

我目前正在設計一個GUI,允許用戶定義一些邏輯。我不希望它變得太複雜,所以我將它限制在一組括號內。所以,這個想法是檢查在開始和結束括號之間沒有任何其他開頭括號。Array.indexOf之間還是?

例如。 IF (a + b OR **(** b+ c)將發生錯誤提示。

所以我用的路線決定:

  • 找到的第一個開放式托架
  • 找到的第一個右括號
  • 使用這些指數之間的搜索和查找任何打開的支架
  • 如果有任何開放括號被發現顯示一個錯誤
  • 繼續循環的任何其他邏輯

這是代碼。我認爲它非常可怕,我相信必須有更好的方式來做到這一點。也許某種IndexOf。

<select rel="OpenBracket" id="open1"> 
    <option value=""></option> 
    <option value="(">(</option> 
</select> 
Some True/Fale here 
<select rel="CloseBracket" id="close1"> 
    <option value=""></option> 
    <option value=")">)</option> 
</select> 
AND 
<br /> 
<select rel="OpenBracket" id="open2"> 
    <option value=""></option> 
    <option value="(">(</option> 
</select> 
Some True/Fale here 
<select rel="CloseBracket" id="close2"> 
    <option value=""></option> 
    <option value=")">)</option> 
</select> 
<button onclick="javascript:TestingRules();">Check</button> 

function GetOpenBrackets() { 
    var openBracketArray = []; 
    jQuery('[rel="OpenBracket"]').each(function() { 
     if (jQuery(this).val() == "(") { 
      openBracketArray.push(jQuery(this).attr('id')); 
     } else { 
      openBracketArray.push(jQuery(this).val()); 
     } 

    }); 
    return openBracketArray; 
} 

function GetCloseBrackets() { 
    var closeBracketArray = []; 
    jQuery('[rel="CloseBracket"]').each(function() { 
     if (jQuery(this).val() == "(") { 
      closeBracketArray.push(jQuery(this).attr('id')); 
     } else { 
      closeBracketArray.push(jQuery(this).val()); 
     } 
    }); 
    return closeBracketArray; 
} 
function TestingRules() { 
    var openBrackets = GetOpenBrackets(); 
    var closeBrackets = GetCloseBrackets(); 
    var closeBracketIndex; 
    var openBracketIndex; 
    for (openBracketIndex in openBrackets) { 
     if (openBrackets[openBracketIndex] !== "") { 

      var foundCloseBracketIndex = -1; 
      for (closeBracketIndex in closeBrackets) { 
       if (openBracketIndex <= closeBracketIndex) { 
        if (closeBrackets[closeBracketIndex] !== "") { 
         foundCloseBracketIndex = closeBracketIndex; 
         break; 
        } 
       } 
      } 
      if (foundCloseBracketIndex > -1) { 
      var openBracketCheck; 
       for (openBracketCheck in openBrackets) { 

        if (openBracketIndex < openBracketCheck && closeBracketIndex >= openBracketCheck) { 
         if (openBrackets[openBracketCheck] !== "") { 
          alert('error'); 
         } 
        } 

       } 
      } 
     } 

    } 

    // for testing: 
    // console.log(OpenBracketArray.length); 
} 

回答

1

爲什麼不保持一個計數器,或算括號堆棧深度?如果你有公開的參與者,決定關閉,並且計數器超過1,那麼你有錯誤。 (如果我理解正確你的要求。)

+0

用這個作爲答案,因爲它是使用我最小的JS知識實現的最簡單的方法。另一篇文章可能非常有效,但我並不完全理解它。另外這是一個非常簡單明顯的解決方案。 – Piercy 2012-08-16 14:07:26

+0

@Piercy它基本上和堆棧一樣,至少在計算parens方面。該堆棧還可以進行表達式評估 - 這是一個更通用的解決方案。不同之處在於inc/dec /數字比較與push/pop/stack size比較。 – 2012-08-16 14:19:24

1

相信,你可以簡單地嘗試實施

的概念stack(top=0)

push(top=top+1)每當你看到(

[ (可選)如果top> X,其中X是允許的深度,則表示無效表達式長度有誤]

pop(top=top-1)無論何時您看到)

當表達式完成並且stack(top>0)上還剩下任何東西時,您可以推斷表達式不平衡。

+0

棧是正確的方式去這裏,但他不想要深度> X的嵌套括號,所以答案還應該提到堆棧中一次不能有超過X個項目( – 2012-08-15 16:30:19

+0

)這是更簡單,適用於1個或更多。所以如果解決方案足夠簡單,爲什麼不去做。 – SiB 2012-08-15 16:31:31

+1

的確,我只是說如果OP有理由不超過1層深度,那麼答案應該反映 – 2012-08-15 16:33:26

0

而不是試圖找到一對括號,爲什麼不只是連續搜索兩個開放的括號?當您找到第一個開放式括號時,可能有以下兩種情況之一:後面的內容用括號括起來(因此用戶沒有嵌套它們),或者您找到另一個開放式括號。如果您發現另一個開放的括號,用戶正試圖嵌套語句。這樣可以避免您不得不返回並再次搜索相同的空間。

相關問題