İçeriğe atla
ΣDSA Patterns
Menü
Dil

Yığın ile Ayrıştırma

Rehber 4 / 6 · Yol 4 / 6

Etkileşimli

Zihinsel model

Bu problem için animasyonlu çözüm. Adımları kaydır veya boşlukla duraklat; değişmezi yüksek sesle yeniden anlat.

Adım 1 / 6
2
-
(
1
+
2
)
yığın
∅
eşlemres→0sign→+

2-(1+2) değerlendir. Çalışan res ve sign; parantezler iç içe bir biriktirici push eder.

Demo önizleme: Bu çözümler otomatik test paketini geçiyor ama insan tarafından incelenmedi. Trade-off ve yazıları taslak olarak değerlendirin.

Basic Calculator

Problem (yeniden ifade)

+, -, parantez, negatif olmayan tamsayılar ve boşluklarla ifadeyi değerlendir. * veya / yok.

Sezgi

Soldan sağa tara, res ve mevcut sayıyı biriktir. (’de res ve işareti push et, sıfırla; )’de kaydedilmiş işareti uygula ve dış res’i ekle.

Yaklaşımlar

Parantezler için işaret yığını

Doğrulanmadı
Zaman O(n)Alan O(n)

Fikir. Unary bağlamı işaretli terimler olarak işle. Parantezler iç içe biriktirici açar.

Yürüyüş. “(1+(4+5+2)-3)+(6+8)” → 23.

Trade-off. Çok basamaklı sayılar running num gerektirir; boşluklar no-op.

Çözüm
export function calculate(s: string): number {
  let res = 0;
  let num = 0;
  let sign = 1;
  const stack: number[] = [];
  for (let i = 0; i < s.length; i++) {
    const ch = s[i]!;
    if (ch >= "0" && ch <= "9") {
      num = num * 10 + (ch.charCodeAt(0) - 48);
    } else if (ch === "+" || ch === "-") {
      res += sign * num;
      num = 0;
      sign = ch === "+" ? 1 : -1;
    } else if (ch === "(") {
      stack.push(res);
      stack.push(sign);
      res = 0;
      sign = 1;
    } else if (ch === ")") {
      res += sign * num;
      num = 0;
      res *= stack.pop()!;
      res += stack.pop()!;
    }
  }
  return res + sign * num;
}
export function calculate(s: string): number {
  let res = 0;
  let num = 0;
  let sign = 1;
  const stack: number[] = [];
  for (let i = 0; i < s.length; i++) {
    const ch = s[i]!;
    if (ch >= "0" && ch <= "9") {
      num = num * 10 + (ch.charCodeAt(0) - 48);
    } else if (ch === "+" || ch === "-") {
      res += sign * num;
      num = 0;
      sign = ch === "+" ? 1 : -1;
    } else if (ch === "(") {
      stack.push(res);
      stack.push(sign);
      res = 0;
      sign = 1;
    } else if (ch === ")") {
      res += sign * num;
      num = 0;
      res *= stack.pop()!;
      res += stack.pop()!;
    }
  }
  return res + sign * num;
}

Şablon bağlantısı

İç içe ifadelerin yığın ile parse edilmesi.

Yansıma