C ++:使用堆栈验证括号是否平衡(逻辑错误)

时间:2014-03-07 19:44:47

标签: c++ struct stack

我有一个简单的堆栈,我用基本的初始化,显示,推送,弹出,顶部等功能创建。我需要一个函数来验证字符串是否具有匹配的括号。我认为我非常接近,但我遇到以下问题: if(s.size == 0&& c ==')')在我的平衡功能中。

这个条件应该由字符串" s1"在分裂标志之前用括号,但它不是......它仍然是真的。

感谢您的光临。

#include <iostream>
#include <string>
#include <stdlib.h>

using namespace std;

struct Stack{
    static const unsigned MAX_SIZE = 5;
    char data[ MAX_SIZE ];
    unsigned size;
};

void initialize( Stack & stack );
void show( const Stack & stack );
unsigned getSize( const Stack & stack );
void push( Stack & stack, char c );
char pop( Stack & stack );
char top( const Stack & stack );
bool die( const string & msg );
bool balanced (const string & expr);

int main(){

    string s1 = "X*((4+(3-2)/(Y+X))+(Z-8))) / ((A+(B-2))";
    string s2 = "())";
    string s3 = "(()";

    cout << balanced(s1) << endl;
    cout << balanced(s2) << endl;
    cout << balanced(s3) << endl;

}

void initialize( Stack & stack ){
    stack.size = 0;
}

void show( const Stack & stack ){
    cout <<"[" << stack.size <<"]:";
    for(  unsigned i = 0;  i < stack.size;  i++  )
        cout <<stack.data[i];
    cout <<endl;
} // show

unsigned getSize( const Stack & stack ) {return stack.size;}

void push( Stack & stack, char c ){
    if( stack.size == Stack::MAX_SIZE )  die( "push: overflow" );
    stack.data[stack.size++] = c;
} // push

char pop( Stack & stack ){
    if( stack.size == 0 )  die( "pop: underflow" );
    return stack.data[--stack.size];
} // pop

char top( const Stack & stack ){
    if( stack.size == 0 )  die( "top: underflow" );
    return stack.data[stack.size-1];
} // top

bool die( const string & msg ){
    cerr <<endl <<"Fatal error: " << msg <<endl;
    exit( EXIT_FAILURE );
}

bool balanced (const string & expr){

    Stack s;
    initialize(s);

    for (unsigned i = 0; i < expr.size(); i++){
        char c = expr[i];

        if (c == '(')
        {
            if( expr.size() == Stack::MAX_SIZE )  {
                die( "push: overflow" );
            }

            push(s, c);

        }

        if (s.size == 0 && c == ')')
        {
            return false;
        }
        else if (c == ')'){
            pop(s);
        }

        if (s.size == 0){

            return true;
        }

        else

        return false;
    }
}

1 个答案:

答案 0 :(得分:1)

虽然您所需的答案似乎已在您的问题的评论中提供(很好的捕获,dlev),但我想建议一种替代方法,这可能更快。

bool balanced(const string& expression)
{
    int count = 0;
    for (int i = 0; i < expression.size(); ++i)
    {
        if (expression[i] == '(') ++count;
        else if (expression[i] == ')') --count;
        if (count < 0) return false;
    }
    return count == 0;
}

这有效地抛弃了堆栈结构,只保留其大小。它应该低于0,这意味着找到了一个不匹配的右括号,如果循环终止而没有达到0,那么左括号有count个不匹配。

还应该注意,在循环结束后检查count < 0是不够的,因为")("之类的东西会通过测试。