สมมติว่าเรามีสตริงที่แสดงนิพจน์ ternary ที่ซ้อนกันตามอำเภอใจ เราต้องคำนวณผลลัพธ์ของนิพจน์ เราสามารถสรุปได้ว่านิพจน์ที่ให้มานั้นถูกต้องและประกอบด้วยตัวเลข 0-9 เท่านั้น ?, :, T และ F อักขระสองสามตัวเหล่านี้ (ในที่นี้ T และ F แทน True และ False ตามลำดับ) มีคุณสมบัติบางอย่าง -
-
ความยาวของสตริงที่กำหนดต้องน้อยกว่าหรือเท่ากับ 10000
-
แต่ละหมายเลขจะมีเพียงตัวเลขเดียวเท่านั้น
-
กลุ่มนิพจน์เงื่อนไขจากขวาไปซ้าย
-
เงื่อนไขจะเป็น T หรือ F เสมอ ดังนั้นเงื่อนไขจะไม่เป็นตัวเลข
-
ผลลัพธ์ของนิพจน์จะประเมินเป็นตัวเลข 0-9, T หรือ F เสมอ
ตัวอย่างเช่น หากอินพุตเป็นเหมือน “F?1:T?4:5” ดังนั้นผลลัพธ์จะเป็น 4 เนื่องจากจะแยกวิเคราะห์นิพจน์ทางขวาสุด “T?4:5” จะส่งกลับ 4 แล้ว นิพจน์หลักจะเป็น “F?1:4” ดังนั้นค่าที่ส่งคืนคือ 4
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ret :=สตริงว่าง n :=ขนาดของ s สร้าง stack st
-
สำหรับฉันอยู่ในช่วง n – 1 ลงไปที่ 0
-
x :=s[i]
-
ถ้า st ไม่ว่างและด้านบนของ stack คือ '?' แล้ว
-
ลบออกจาก st
-
อันดับแรก :=ด้านบนของ st จากนั้นลบสององค์ประกอบออกจากสแต็ก
-
วินาที :=ด้านบนของสแต็กและลบออกจาก st
-
ถ้า x คือ T ให้ใส่ st ก่อน มิฉะนั้น ให้ใส่วินาทีลงใน st
-
-
มิฉะนั้น ให้ใส่ x ลงใน st
-
-
ในขณะที่ st ไม่ว่างเปล่าแล้ว
-
ret :=ret + ด้านบนของ st และลบออกจาก st
-
-
ย้อนกลับและย้อนกลับ
ตัวอย่าง (C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; class Solution { public: string parseTernary(string s) { string ret = ""; int n = s.size(); stack <char> st; for(int i = n - 1; i >= 0; i--){ char x = s[i]; if(!st.empty() && st.top() == '?'){ st.pop(); char first = st.top(); st.pop(); st.pop(); char second = st.top(); st.pop(); if(x == 'T'){ st.push(first); } else st.push(second); } else{ st.push(x); } } while(!st.empty()){ ret += st.top(); st.pop(); } reverse(ret.begin(), ret.end()); return ret; } }; main(){ Solution ob; cout << (ob.parseTernary("F?1:T?4:5")); }
อินพุต
"F?1:T?4:5"
ผลลัพธ์
4