Postfix เพื่อมัดด้วยตัวดำเนินการ unary/binary

ฉันกำลังพยายามสร้างตัวแปลงจาก postfix ไปเป็น infix notation และต้องการความช่วยเหลือ มีคำถามเกี่ยวกับการแปลง infix-to-postfix อยู่แล้ว ซึ่ง ให้ตัวอย่างที่ฉันไม่สามารถแปลงกลับได้ (หมายเหตุ: เครื่องหมายลบหายไปตรงนั้น!)

ต่อไปนี้เป็นเอาต์พุตของตัวแปลงของฉัน โดยที่ "คอลัมน์" ตัวแรกคืออินพุต postfix คอลัมน์ที่ 2 คือเอาต์พุต infix ของฉัน และคอลัมน์ที่ 3 คือสิ่งที่ฉันควรได้รับ(?):

2 -                      =   - 2                           =?    - 2                       true
1 + 2 +                  =   + 1 + 2                       =?    + 1 + 2                   true
1 + 2 + +                =   + (+ 1 + 2)                   =?    + 1 + + 2                 false
1 + 2 + + 3 - - 4 - -    =   - (- (+ (+ 1 + 2) - 3) - 4)   =?    + 1 + + 2 - - 3 - - 4     false

คุณคิดว่าเป็นไปได้ที่จะแก้ปัญหานี้หรือสองบรรทัดสุดท้ายถูกแปลงอย่างถูกต้องจริง ๆ หรือไม่? คุณจะเขียนอัลกอริทึมเพื่อแก้ไขปัญหานี้อย่างไร

โปรดสมมติว่าสามารถตั้งค่าตัวดำเนินการได้มากขึ้น (ไม่เพียงแต่ + และ -) ให้เป็นทั้งเอกนารีและไบนารี โดยที่ตัวดำเนินการเอกนารีมีลำดับความสำคัญสูงกว่าไบนารี

อ้างอิง

  1. Ruby Quiz #148: Postfix to Infix หรือผ่านทาง Google Groups
  2. อัลกอริทึม Shunting-yard (C, Python, Perl) พร้อมการสนับสนุนตัวดำเนินการแบบเอกนารี บน LiteratePrograms

person Andrei    schedule 09.08.2010    source แหล่งที่มา
comment
ฉันไม่เชี่ยวชาญ แต่สัญกรณ์มัดไม่ควรใช้วงเล็บใช่ไหม คอลัมน์ที่ 3 สำหรับฉันดูไม่เหมือนสัญกรณ์มัดและมันไม่ชัดเจน   -  person dierre    schedule 11.08.2010


คำตอบ (1)


สัญกรณ์ Postfix ไม่มีแนวคิดเรื่องลำดับความสำคัญ เนื่องจากตัวถูกดำเนินการสำหรับตัวดำเนินการใดๆ จะเป็นค่า N บนสุดของสแต็กเสมอ (ซึ่งจากนั้นจะถูกแทนที่ด้วยผลลัพธ์ของตัวดำเนินการ

ปัญหาหนึ่งของสัญกรณ์ postfix ก็คือ มันไม่สามารถรับมือกับสัญลักษณ์ตัวดำเนินการที่สามารถอ้างถึงตัวดำเนินการที่แตกต่างกันได้ ขึ้นอยู่กับจำนวนของตัวถูกดำเนินการ (เช่น - ซึ่งสามารถแทนค่าเอกพจน์หรือเลขฐานสองลบได้) วิธีเดียวที่จะทำเช่นนั้นได้คือต้องแน่ใจว่าโอเปอเรเตอร์แต่ละคนมีสัญลักษณ์เฉพาะที่แสดงถึงสัญลักษณ์นั้น

person Bart van Ingen Schenau    schedule 25.08.2010