Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

Ternary Expression Parser ใน C ++


สมมติว่าเรามีสตริงที่แสดงนิพจน์ 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