我有一个简单的堆栈,我用基本的初始化,显示,推送,弹出,顶部等功能创建。我需要一个函数来验证字符串是否具有匹配的括号。我认为我非常接近,但我遇到以下问题: 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;
}
}
答案 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
是不够的,因为")("
之类的东西会通过测试。