在下面的代碼中
function validBraces(braces) {
var matches = { '(': ')', '{': '}', '[': ']' };
var stack = [];
var currentChar;
for (var i = 0; i < braces.length; i ) {
currentChar = braces[i];
if (matches[currentChar]) {
stack.push(currentChar);
} else {
if (currentChar !== matches[stack.pop()]) {
return false;
}
}
}
return stack.length === 0;
}
據我了解,這段代碼
currentChar !== 匹配[stack.pop()]
檢查當前字符是否是堆疊陣列中最后一個元素的必要左大括號,如果正確,則彈出堆疊陣列中的最后一個元素。但在語法中,如果匹配則沒有條件,就像這樣
if(currentChar == matches[stack.pop()]
{stack.pop()}
因此,stack.pop()盡管沒有真正的條件,但仍在 if 條件陳述句中作業。它究竟是如何在這里作業的?
uj5u.com熱心網友回復:
運算式是從內向外計算的。
pop從陣列中洗掉最后一個元素并回傳洗掉的值。而這個字符(因為stack只包含字符)用于訪問matches物件中的相應屬性。
您可以按如下方式重寫代碼:
if (currentChar !== matches[stack.pop()]) {
return false;
}
相當于
let stackElement = stack.pop();
let match = matches[stackElement];
if (currentChar !== match) {
return false;
}
編輯關于您的評論
從代碼中的這個位置回傳 true 與pop(無論你的意思是什么)的“特征”沒有任何關系。
整個功能是檢查平衡括號。代碼的特定部分檢查當前字符是否是堆疊上當前元素的匹配等效項。如果不是這種情況,則大括號沒有正確匹配,因此您可以立即回傳false. 但是您不能true在此位置回傳,因為要確定大括號是否正確匹配,您必須檢查整個輸入字串。因此,函式的最后一行
return stack.length === 0;
在處理了整個字串之后,您檢查所有大括號是否已正確匹配。如果stack.length === 0給出 false,則堆疊上仍有不匹配的大括號,因此函式的結果是false. 如果stack.length === 0為真,則沒有不匹配的大括號,因此函式的結果是true
uj5u.com熱心網友回復:
stack.pop() 在計算運算式之前執行。它將與以下代碼相同:
// ...
const lastEncounteredOpeningBracket = stack.pop();
const requiredClosingBracket = matches[lastEncounteredOpeningBracket]
if (currentChar !== requiredClosingBracket ) {
return false;
}
// ...
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/408133.html
標籤:
