2012-12-07 253 views
5

我已經被要求作爲獎金編程挑戰來查看大括號是否匹配隨機字符串或像這樣的字符:{1 + 1}這將返回1,而{1 + 1})會返回0. 這是我迄今爲止的,但它似乎沒有做任何事情。任何幫助將是偉大的?謝謝C++檢查大括號是否匹配

//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,'(')){return false; }' – MSalters

回答

1

,但它似乎並沒有做任何事情

它做一些事情。它打印This program checks brace ([{}]) matching in a string.

你打電話給checkBraces ("{1+1}"),但你沒有做任何與返回的值。由於這個調用可以被優化,所以從某種意義上說,你的程序似乎沒有任何作用。

因此,讓它做一些事情。打印要測試的字符串,然後打印測試結果。一旦你做完了,你應該測試一下,當你完成這個時,你應該測試更多。不要只測試簡單的案例,如{i+1}。測試應該通過的錯綜複雜的案例,以及應該失敗的測試案例。

學習如何測試和學習如何進行調試與學習如何編寫代碼一樣重要的技能(如果不是更重要的技能)。

+0

我不能相信我所要做的只是cout << checkBraces(input);我的程序非常感謝。我已經測試了幾個例子,因爲我知道它應該返回1。 –

6

什麼讓你覺得它什麼都不做?它的確如此。它檢查大括號,但是你沒有做任何事情,返回checkBraces,順便說一句,應該返回bool,而不是int

難道您原本是這樣的:

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

人提示:學習如何使用調試器。在開始編碼之前,您應該學習如何進行調試,而不僅僅是「hello world」。

+0

'「{(})」'被解釋爲:當遇到''}'時,堆棧的頂部將是''(''。 – MSalters

+0

@ MSalters啊,這是真的,我錯過了。 –

+0

好吧好吧,使用你的IF語句你給我提供了我的程序似乎工作得很好。我只需要能夠提示用戶輸入一個字符串,並返回1或0.我認爲我可以通過使該方法是一個布爾而不是一個int來完成? –

2

您應該做的最低要求是打印checkBraces的結果。

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 
} 

我沒有寫一切,因爲它總是最好自己去尋找答案一個,它會自動進行比較。