สมมติว่าเรามีนิพจน์ที่เก็บนิพจน์ไตรภาคไว้ เราต้องประเมินผลลัพธ์ของนิพจน์ รองรับค่าบางอย่างเช่น T และ F สำหรับ True และ False และ “?” และอักขระ “:” มีคุณสมบัติบางอย่าง:
- ความยาวของสตริงที่กำหนดต้องน้อยกว่าหรือเท่ากับ 10000
- กลุ่มนิพจน์เงื่อนไขจากขวาไปซ้าย
- เงื่อนไขจะเป็น T หรือ F เสมอ ดังนั้นเงื่อนไขนี้จะไม่เป็นตัวเลข
- ผลลัพธ์ของนิพจน์จะประเมินเป็น T หรือ F เสมอ
ตัวอย่างเช่น หากอินพุตเป็นแบบ “T ? ที ? F :T :T” ดังนั้นผลลัพธ์จะเป็น F.
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้:
- ret :=สตริงว่าง n :=ขนาดของ s
- สร้างสแต็ก st
- สำหรับ i ในช่วง n – 1 เหลือ 0
- x :=s[i]
- ถ้า st ไม่ว่างและด้านบนของสแต็กคือ '?' แล้ว
- ลบออกจาก st
- ก่อน :=ด้านบนของ st จากนั้นลบสององค์ประกอบออกจากสแต็ก
- วินาที :=ด้านบนของสแต็ก และลบออกจาก st
- ถ้า x เป็น T ให้ใส่ st ก่อน มิฉะนั้น ให้ใส่วินาทีลงใน st
- มิฉะนั้นให้ใส่ x ลงใน st
- ในขณะที่ st ไม่ว่างเปล่า แล้ว
- ret :=ret + ด้านบนของ st และลบออกจาก st
- ย้อนกลับและย้อนกลับ
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น:
ตัวอย่าง
#include
using namespace std;
class Solution {
public:
string parseTernary(string s) {
string ret = "";
int n = s.size();
stack 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("T?T?F:T:T"));
} อินพุต
" T?T?F:T:T"
ผลลัพธ์
F