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

โปรแกรมเพื่อประเมินนิพจน์ไตรภาคใน C++


สมมติว่าเรามีนิพจน์ที่เก็บนิพจน์ไตรภาคไว้ เราต้องประเมินผลลัพธ์ของนิพจน์ รองรับค่าบางอย่างเช่น 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