2012-12-07 15 views
5

मुझे बोनस प्रोग्रामिंग चुनौती के रूप में पूछा गया है कि क्या ब्रेसिज़ यादृच्छिक स्ट्रिंग या इस तरह के चार में मेल खाते हैं: {1 + 1} यह 1 लौटाएगा, जबकि {1 + 1}) होगा वापसी 0 यह मेरे पास अभी तक है लेकिन ऐसा कुछ भी प्रतीत नहीं होता है। कोई भी मदद बहुत अच्छी रहेगी? धन्यवादसी ++ जांचें कि ब्रेसिज़ मैच

//bonus.cpp 
#include <iostream> 
#include <string> 
#include <queue> 
#include <stack> 

using namespace std; 

int checkBraces (string s) 
{ 
    //int myLength = s.length(); 
    std::stack<int> stack; 
    char d; 

    for (int i = 0; i < s.length(); i++) 
    { 
     char c = s[i]; 

     if (c == '(') 
     { 
      stack.push(c); 
     } 
     else if (c == '[') 
     { 
      stack.push(c); 
     } 
     else if (c == '{') 
     { 
      stack.push(c); 
     } 

     else if (c == ')') 
     { 
      if (stack.empty()) 
      { 
       return false; 
      } 
      else 
      { 
       d = stack.top(); 
       stack.pop(); 
       if (d != '(') 
       { 
        return false; 
       } 
      } 
     } 

     else if (c == ']') 
     { 
      if (stack.empty()) 
      { 
       return false; 
      } 
      else 
      { 
       d = stack.top(); 
       stack.pop(); 
       if (d != '[') 
       { 
        return false; 
       } 
      } 
     } 
     else if (c == '}') 
     { 
      if (stack.empty()) 
      { 
       return false; 
      } 
      else 
      { 
       d = stack.top(); 
       stack.pop(); 
       if (d != '{') 
       { 
        return false; 
       } 
      } 
     } 
    } 

    if (stack.empty()) return true; 
    else return false; 

} 


int main() 
{ 
    cout << "This program checks brace ([{}]) matching in a string." << endl; 

    checkBraces ("{1+1}"); 

} 
+2

क्या आपने वास्तव में क्या चल रहा है यह देखने के लिए अपने डीबगर में कोड के माध्यम से कदम उठाने का प्रयास किया था? –

+0

* कुछ भी नहीं लगता है * - यहां अधिक जानकारी का उपयोग कर सकता है। –

+0

आपको काफी हद तक अनावश्यकता मिली है। शायद आपके पास 'bool pop_if_possible (std :: stack , char)' विधि होनी चाहिए ताकि आप 'if (c ==')'&& pop_if_possible (stack, '(')) लिख सकें {{झूठी वापसी; } ' – MSalters

उत्तर

1

लेकिन यह कुछ भी

यह कुछ करना है क्या करना प्रतीत नहीं होता। यह This program checks brace ([{}]) matching in a string. प्रिंट करता है।

आप checkBraces ("{1+1}") पर कॉल कर रहे हैं लेकिन आप लौटे हुए मूल्य के साथ कुछ भी नहीं कर रहे हैं। चूंकि इस कॉल को अनुकूलित किया जा सकता है, इसलिए आप एक अर्थ में सही हैं कि आपका प्रोग्राम कुछ भी नहीं कर रहा है।

तो इसे कुछ करें। परीक्षण की जाने वाली स्ट्रिंग को मुद्रित करें, फिर परीक्षण के परिणाम मुद्रित करें। एक बार ऐसा करने के बाद, आपको परीक्षण करना चाहिए, और जब आप इसके साथ काम करेंगे, तो आपको कुछ और परीक्षण करना चाहिए। {i+1} जैसे आसान मामलों का परीक्षण न करें। परीक्षा उत्तीर्ण मामलों को पारित करना चाहिए, और उन मामलों का परीक्षण भी करना चाहिए जो असफल हो जाएं।

डीबग कैसे करें और सीखना सीखना सीखना सीखना है जैसे कोड लिखना सीखना उतना ही महत्वपूर्ण कौशल (यदि अधिक महत्वपूर्ण कौशल नहीं है)।

+0

मुझे विश्वास नहीं है कि मुझे बस इतना करना था << चेकब्रेस (इनपुट); मेरा कार्यक्रम बहुत अच्छा काम कर रहा है। मैंने कई मामलों का परीक्षण किया है क्योंकि मैं सिर्फ उस का उपयोग कर रहा हूं क्योंकि मुझे पता था कि इसे 1 वापस करना चाहिए। –

6

आपको क्या लगता है कि यह कुछ भी नहीं करता है? ऐसा होता है। यह ब्रेसिज़ के लिए जांचता है, लेकिन आप checkBraces की वापसी के साथ कुछ भी नहीं कर रहे हैं, जो बीटीडब्ल्यू को bool वापस करना चाहिए, int नहीं।

क्या आप शायद की तरह कुछ का मतलब:

if (checkBraces ("{1+1}")) 
    cout << "matching"; 
else 
    cout << "not matching"; 

समर्थक टिप: सीखें कि कैसे एक डिबगर उपयोग करने के लिए। आपको "हैलो वर्ल्ड" से कुछ भी कोडिंग शुरू करने से पहले डीबग करना सीखना चाहिए।

+0

'" {(}) "' के लिए जिम्मेदार है: जब ''} 'का सामना किया जाता है, तो स्टैक का शीर्ष '' ('' – MSalters

+0

@MSalters आह होगा, यह सच है, मुझे याद आया। –

+0

ठीक है आपके आईएफ स्टेटमेंट का उपयोग करके आपने मुझे प्रदान किया है कि मेरा प्रोग्राम बहुत अच्छी तरह से काम कर रहा है। मुझे बस एक स्ट्रिंग दर्ज करने और 1 या 0 लौटने के लिए उपयोगकर्ता को संकेत देने में सक्षम होना चाहिए। मुझे लगता है कि मैं उस विधि को एक int के बजाय एक बूलियन बनाकर पूरा कर सकता हूं? –

2

न्यूनतम आपको चेकब्रेस के परिणाम प्रिंट करना है।

2

जो पहले से ही कहा जा चुका है इसके अतिरिक्त के रूप में, मैं कहूंगा कि आप कोड की मात्रा को कम कर सकते हैं। वैसे भी आप अपने ढेर में चार्ज डालते हैं, क्यों std::stack<char> नहीं है?

आप स्वचालित रूप से यह std::algorithms

const std::string openingBraces("{[("); 
const std::string closingBraces("}])"); 

if (std::find(openingBraces.begin(), openingBraces.end(), currentChar) != openingBraces.end()) 
    yourStack.push(currentChar); 
else if (std::find(closingBraces.begin(), closingBraces.end(), currentChar) != closingBraces.end()) 
{ 
    // check if currentChar is matching the one on top of your stack 
} 

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

संबंधित मुद्दे