2013-01-01 41 views
5

मैं जावा के लिए बहुत नया हूं और मैं एक कैलकुलेटर बना रहा हूं, जो समीकरण लेता है और इसका मूल्यांकन करता है।ब्रैकेट प्राथमिकता

मैं इनपुट प्राप्त करने के लिए स्कैनर विधि का उपयोग कर रहा हूं, लेकिन इसका मतलब है कि मेरा इनपुट स्कैनर प्रकार है। इस इनपुट में मुझे क्या करना चाहिए ताकि मैं इसका मूल्यांकन कर सकूं? और एक बार जब मैं इसका मूल्यांकन कर सकता हूं, तो मैं ब्रैकेट को प्राथमिकता कैसे दे सकता हूं?

उदाहरण के लिए, समीकरण (5 * (4 + 3)) * 2 के लिए, मैं प्रोग्राम को पहले मूल्यांकन (4 + 3) करना चाहता हूं, फिर इसे 4 से गुणा करें, फिर यह सब गुणा करें 2.

बहुत बहुत धन्यवाद।

+0

आपको स्ट्रिंग के रूप में अपनी अभिव्यक्ति (समीकरण नहीं, क्योंकि इसमें कोई समान चिह्न शामिल नहीं है) में पढ़ना होगा और इसे पार्स करना होगा। 'स्कैनर' का उपयोग करके टेक्स्ट की एक पंक्ति पढ़ने के अलावा, आपको इस प्रक्रिया में बहुत दूर नहीं मिलता है। –

+0

आपने जो किया वह सही है, बाएं से दाएं से प्राथमिकता दी गई है। या आप ((4 + 3) * 5) * 2 का उपयोग कर सकते हैं। आंतरिक ब्रैकेट का मूल्यांकन पहले किया जाता है। –

+1

अपने ऑपरेटरों को ब्रैकेट समेत एक ढेर में रखें। – user1929959

उत्तर

1

मुझे लगता है कि यह सहायक होगा: Polish notation और Reverse Polish notation। वे एक पेड़ में स्ट्रिंग को विभाजित करने और एक समय में एक कदम निष्पादित करने के विचार को समझाते हैं।

3

आपको जो चाहिए वह डिजस्ट्रा का Shunting Yard Algorithm है। यह पोस्ट-फ़िक्स नोटेशन में गणितीय नोटेशन को ठीक-ठीक करता है, जो ऑपरेटर प्राथमिकता और ब्रैकेट के साथ सभी समस्याओं को अच्छी तरह से व्यवस्थित करता है क्योंकि पोस्ट-फ़िक्स नोटेशन के लिए उनमें से किसी के लिए कोई आवश्यकता नहीं है। विकिपीडिया पेज में सी में एक पूर्ण उदाहरण है, जिसे जावा में अनुवादित किया जा सकता है।

1

@ सिमॉन जी के डिजस्ट्रा के शंटिंग यार्ड एल्गोरिदम का उपयोग करने के सुझाव के सुझाव ने इसे खींचा है। प्रतीकों को पार्स करने के लिए आपको "माइक्रो-व्याकरण" को लागू करने की आवश्यकता होगी, लेकिन Scanner काम का 95% कर सकता है।

एक विकल्प एक पार्सर जेनरेटर जैसे एएनटीएलआर या जैवैक का उपयोग करके अभिव्यक्ति पार्सर को कार्यान्वित करना होगा, और फिर पेड़ के एक ट्रैवर्सल के रूप में मूल्यांकन लागू करना होगा। लेकिन अगर आप बस एक बार अभिव्यक्ति का मूल्यांकन करना चाहते हैं तो यह भारी वजन है।

अंत में, मैं यह ध्यान रखना चाहता हूं कि यह एक अच्छी तरह से ज्ञात (हल) समस्या है, यह किसी भी भाषा में एक छोटा नहीं है ... और शायद यह आपको बता रहा है कि आपको अपने ज्ञान को पूरा करने के लिए एल्गोरिदम और/या कंपाइलर्स पर कुछ और पढ़ने की आवश्यकता है।

+0

से गुणा करें रिकर्सिव वंश एक और संभावना है, और शायद मेरी पहली पसंद है, लेकिन फिर मुझे पहले से ही पता है कि यह कैसे करना है ;-) – EJP