2017-02-10 11 views
0

У меня возникла небольшая проблема в реализации этой функции. Он должен иметь возможность убедиться, что все скобки введены правильно, такие как:() [] истинно, а [({} [])] истинно, но [[] будет ложным. Я должен использовать стек внутри этой функции, но по какой-то причине он сравнивал 2 скобки правильно, но все, что было введено выше 2, не будет работать. Любая помощь приветствуется, спасибо.Функция проверки брекета только тесты сначала 2 введен?

Вот мой код:

function.h:

#include<iostream> 
#include"stack.h" 
using std::string; 


bool bracketCheck(const string& s) { 

    Stack<char> stack; 

    if (!s.empty()) { 
      for (int i = 0; i < s.length(); i++) { 
        if (s[i] == '(' || s[i] == '{' || s[i] == '[') { 
          stack.push(s[i]); 
        } 
        else if (s[i] == ')' && stack.top() == '(' || s[i] == '}' && stack.top() == '(' || s[i] == ']' && stack.top() == '['){ 
          stack.pop(); 
        } 
      } 
      return stack.isEmpty() ? true : false; 
    } 
} 

stack.h:

template <typename T> 
class Stack{ 
T* theStack_; 
int max_; 
int size_; 
void grow(){ 
    T* tmp=new T[max_*2]; 
    for(int i=0;i<size_;i++){ 
     tmp[i]=theStack_[i]; 
    } 
    max_=max_*2; 
    delete [] theStack_; 
    theStack_=tmp; 
} 
public: 
Stack(){ 
    theStack_=new T[50]; 
    max_=50; 
    size_=0; 
} 
void push (const T& data){ 
    if(size_==max_){ 
     grow(); 
    } 
    theStack_[size_]=data; 
    size_++; 
} 
void pop(){ 
    if(!isEmpty()){ 
     size_--; 
    } 
} 
//removed top() const 
T top() { 
    if(!isEmpty()){ 
     return theStack_[size_-1]; 
    } 
    return T{}; 
} 
bool isEmpty(){ 
    return size_==0; 
} 
~Stack(){ 
    delete [] theStack_; 
} 
}; 

главная:

int main() 
{ 
    string expression; 

    cout << "Enter an expression: "; 
    cin >> expression; 
    if (bracketCheck(expression)) 
      cout << "Balanced\n"; 
    else 
      cout << "Not Balanced\n"; 
} 

, например: он выходит как говорится (] не сбалансирован, но()] сбалансирован.

+0

Ваше довольно длинное булевское условие в вашем 'else-if' нуждается в некотором« брекетинге »: по своему усмотрению. Смешивание '&&' и '||' возможно не так, как вы думаете. Будьте * конкретными * в своих условных выражениях и не бойтесь бросать вокруг них парсеры. – WhozCraig

+0

'bracketCheck' имеет пути, которые не имеют оператора' return'. Это означает, что программа недействительна, и компилятор разрешает генерировать код, который делает все, что он хочет. – user4581301

ответ

1

Вы проблема в этой строке кода:

if (s[i] == ')' && stack.top() == '(' || s[i] == '}' && stack.top() == '(' || s[i] == ']' && stack.top() == '[') 

Где нужно «группа» свои условия, как это:

if ((s[i] == ')' && stack.top() == '(') || (s[i] == '}' && stack.top() == '{') || (s[i] == ']' && stack.top() == '[')) 

заметить также { опечатку исправить.

+0

Я изменил его на предыдущий .... но он все еще говорит()) сбалансирован, например, – bp06km

+0

это проблема в основном, может быть? – bp06km

+0

Прошли ли вы через свой код? Если вы работаете в Visual Studio, используйте F-10 и посмотрите, где ваш код отличается от ваших ожиданий. –