支架检查功能仅测试前2个输入?

时间:2017-02-10 01:04:27

标签: c++ data-structures stack

我在实现此功能时遇到了一些心理问题。它应该能够确保正确输入所有括号,例如:()[]为真且[({} [])]为真,但[[]为假。我必须在此函数中使用堆栈,但由于某种原因,它正确地比较了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";
}
例如:它出来说(]不平衡但()]是平衡的。

1 个答案:

答案 0 :(得分: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() == '['))

另请注意{拼写错误。