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

เครื่องคิดเลขพื้นฐาน III ใน C++


สมมติว่าเรามีสตริงนิพจน์ง่ายๆ และเราต้องนำเครื่องคำนวณพื้นฐานไปใช้เพื่อประเมินนิพจน์นั้น สตริงนิพจน์อาจมีวงเล็บเปิดและปิด เครื่องหมายบวก + หรือลบ - จำนวนเต็มไม่เป็นลบ และพื้นที่ว่าง สตริงนิพจน์ประกอบด้วยเฉพาะจำนวนเต็มไม่เป็นลบ, +, -, *, / โอเปอเรเตอร์, วงเล็บเปิดและปิด และพื้นที่ว่าง การหารจำนวนเต็มควรตัดให้เหลือศูนย์

ดังนั้นหากอินพุตเป็น "6-4 / 2" เอาต์พุตจะเป็น 4

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • l1 :=0, l2 :=1

  • o1 :=1, o2 :=1

  • กำหนดหนึ่งสแต็ก st

  • n :=ขนาดของ s

  • สำหรับการเริ่มต้น i :=0 เมื่อ i

    • x :=s[i]

    • ถ้า x>='0' และ x <='9' แล้ว −

      • num :=x - '0'

      • ในขณะที่ (i + 1 ='0' และ s[i + 1] <='9') ทำ -

        • (เพิ่ม i ขึ้น 1)

        • num :=(num * 10) + (s[i] - '0')

      • l2 :=(ถ้า o2 เหมือนกับ 1 แล้ว l2 * num มิฉะนั้น l2 / num)

    • มิฉะนั้นเมื่อ x เหมือนกับ '(' แล้ว −

      • ใส่ l1 เข้าไปใน st ใส่ o1 เข้าไปใน st

      • ใส่ l2 เข้าไปใน st ใส่ o2 เข้าไปใน st

      • l1 :=0, o2 :=1

      • o1 :=1, l2 :=1

    • มิฉะนั้นเมื่อ x เหมือนกับ ')' ดังนั้น −

      • อุณหภูมิ :=l1 + o1 * l2

      • o2 :=องค์ประกอบด้านบนของ st

      • ลบองค์ประกอบออกจาก st

      • l2 :=องค์ประกอบด้านบนของ st

      • ลบองค์ประกอบออกจาก st

      • o1 :=องค์ประกอบด้านบนของ st

      • ลบองค์ประกอบออกจาก st

      • l1 :=องค์ประกอบด้านบนของ st

      • ลบองค์ประกอบออกจาก st

      • l2 :=(ถ้า o2 เหมือนกับ 1 แล้ว l2 * temp มิฉะนั้น l2 / temp)

    • มิฉะนั้นเมื่อ x เหมือนกับ '*' หรือ x เหมือนกับ '/' ดังนั้น −

      • o2 :=(ถ้า x เหมือนกับ '*' ให้เปลี่ยนเป็น 1 มิฉะนั้น -1)

    • มิฉะนั้นเมื่อ x เหมือนกับ '+' หรือ x เหมือนกับ '-' ดังนั้น −

      • ถ้า x เหมือนกับ '-' และ (i เท่ากับ 0 หรือ (i - 1>=0 และ s[i - 1] เหมือนกับ '(')) ดังนั้น −

        • o1 :=-1

        • ละเว้นส่วนต่อไปนี้ ข้ามไปยังการทำซ้ำถัดไป

      • l1 :=l1 + o1 * l2

      • o1 :=(ถ้า x เหมือนกับ '+' แล้ว 1 มิฉะนั้น -1)

      • l2 :=1, o2 :=1

  • กลับ l1 + o1 * l2

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
   public:
   int calculate(string s) {
      lli l1 = 0;
      lli l2 = 1;
      lli o1 = 1;
      lli o2 = 1;
      stack<lli> st;
      lli n = s.size();
      for (lli i = 0; i < n; i++) {
         char x = s[i];
         if (x >= '0' && x <= '9') {
            lli num = x - '0';
            while (i + 1 < n && s[i + 1] >= '0' && s[i + 1] <= '9') {
               i++;
               num = (num * 10) + (s[i] - '0');
            }
            l2 = (o2 == 1) ? l2 * num : l2 / num;
         }
         else if (x == '(') {
            st.push(l1);
            st.push(o1);
            st.push(l2);
            st.push(o2);
            l1 = 0;
            o2 = 1;
            o1 = 1;
            l2 = 1;
         }
         else if (x == ')') {
            lli temp = l1 + o1 * l2;
            o2 = st.top();
            st.pop();
            l2 = st.top();
            st.pop();
            o1 = st.top();
            st.pop();
            l1 = st.top();
            st.pop();
            l2 = (o2 == 1) ? l2 * temp : l2 / temp;
         }
         else if (x == '*' || x == '/') {
            o2 = (x == '*') ? 1 : -1;
         }
         else if (x == '+' || x == '-') {
            if (x == '-' && (i == 0 || (i - 1 >= 0 && s[i - 1] == '('))) {
               o1 = -1;
               continue;
            }
            l1 += o1 * l2;
            o1 = (x == '+') ? 1 : -1;
            l2 = 1;
            o2 = 1;
         }
      }
      return l1 + o1 * l2;
   }
};
main(){
   Solution ob;
   cout << (ob.calculate("(5+9*3)/8"));
}

อินพุต

"(5+9*3)/8"

ผลลัพธ์

4