假设我有一个非常庞大的文件,我想检查括号是否平衡。我不能使用堆栈,对吧?因为它会导致堆栈溢出。我可以使用什么方法?
答案 0 :(得分:13)
一个简单的计数器。因为你所做的只是计算括号:
balance = 0
for c in open('filename.ext', 'r'):
if c == '(':
balance += 1
elif c == ')':
balance -= 1
if balance == 0:
print 'parenthesis are (possibly) balanced'
else:
print 'parenthesis are not balanced'
为什么(可能)?那么,使用这种方法,你会发现这种平衡:
a(bc))d(ef
这可能不是你所期望的......所以......你可能想早点在这里打破:
balance = 0
for c in open('filename.ext', 'r'):
if c == '(':
balance += 1
elif c == ')':
balance -= 1
if balance < 0:
break # -1 -> we found a closing paren without an opening one...
if balance == 0:
print 'parenthesis are balanced'
else:
print 'parenthesis are not balanced'
答案 1 :(得分:5)
人们通常提到的“堆栈溢出”与在您的情况下使用堆栈(作为数据结构)无关。
使用堆栈大多是一种合理的方式。如果你的目的只是为了找出
然后你可以通过一个简单的循环和一个计数器来完成它:
在伪代码中:
function boolean isBalanced(input) {
int counter = 0;
while (! input.hasMoreChar) {
char c = input.readNextChar();
if (c == OPEN_PARENTHESIS) {
counter++;
} else if (c == CLOSE_PARENTHESIS) {
if (counter == 0) {
return false; // Close parenthesis appear without a corresponding open
} else {
counter--;
}
}
}
return counter == 0;
}
答案 2 :(得分:0)
解决此问题的一种简单方法是保留变量,并在(
上递增,而在)
上递减,如果变量不为零,则该变量无效。
这将适用于多种括号的一种类型,您可能需要对另一种变量实施独立检查。
bool checkParenthesis(string s) {
int buffer = 0;
for(int i=0; i<s.length(); i++){
if(s[i]=='('){
buffer++;
}
else if(s[i]==')'){
if(buffer>0) buffer--;
else return false;
}
}
return !buffer;
}
答案 3 :(得分:0)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int func(char *s);
int main()
{
char *input1=malloc(sizeof(char)*100);
printf("Balanced Parenthesis Program:\n");
printf("Enter data for Balanced Parenthesis\n");
scanf("%[^\n]%*c",input1);
func(input1);
}
int func(char *input1)
{
int count1=0,count2=0,count3=0,flag=0;
for(int i=0;input1[i]!='\0';i++)
{
if(input1[i]=='('||input1[i]==')')
count1++;
else if(input1[i]=='{'||input1[i]=='}')
count2++;
else if(input1[i]=='['||input1[i]==']')
count3++;
else
continue;
}
for(int i=0;input1[i]!='\0';i++)
{
if(input1[i]=='(')
{
if(input1[i+1]=='}'||input1[i+1]==']')
return 0;
}
else if(input1[i]=='{')
{
if(input1[i+1]==']'||input1[i+1]==')')
return 0;
}
else if(input1[i]=='[')
{
if(input1[i+1]==')'||input1[i+1]=='}')
return 0;
}
else
continue;
}
if((count1+count2+count3)%2==0)
printf("Balanced");
else
printf("Unbalanced");
}
答案 4 :(得分:-1)
describe('functions', () => {
afterEach( () => {
//example var = itReturn;
});
afterAll( () => {
//example var = describeReturn;
});
it('should return true', () => {
expect(true).toBe(true);
});
it('should return false', () => {
expect(false).toBe(false);
});
}