括号配对问题

[复制链接]
查看11 | 回复2 | 2021-1-27 06:52:08 | 显示全部楼层 |阅读模式
我在做ACM试题的题目二,括号匹配问题,在我这边测试的几个数据都没问题,可是提交之后总是显示超时,改了很久也没改对,麻烦各位大神帮我看看那儿有问题。
编程思路:
利用Match()函数来判断每个输入的字符串是否匹配
判断过程:
利用栈,
如果输入的是左括号,就压入栈;
如果输入的是右括号,则判断站顶是否是该类型的左括号:是,则弹栈,判断下一字符;否则跳出;
最后判断如果栈空,同时字符串指向‘\0’,则说明匹配,否则不匹配;
#include
#include
usingnamespace::std;
boolMatch(char*a)
{
stacktest;
inti=0;
while(a!='\0')
{
if(a=='{'||a=='(')
{
test.push(a);
i++;
}
if(a=='}')
{
if(!test.empty())
{
if(test.top()=='{')
{
test.pop();
i++;
continue;
}
else{
break;
}
}
else
{
break;
}
}
if(a==')')
{
if(!test.empty())
{
if(test.top()=='(')
{
test.pop();
i++;
continue;
}
else
{
break;
}
}
else
{
break;
}
}
}
if(a=='\0'&&test.empty())
returntrue;
else
returnfalse;
}
intmain()
{
intn;
cin>>n;
char*test=newchar[10000];
while(n--)
{
cin>>test;
if(Match(test)){
cout
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:52:08 | 显示全部楼层
仅供参考#include
#include
#include
#defineSTACK_INIT_SIZE10
#defineSTACK_GROW_SIZE5
#defineELEMTYPEchar
#defineOK1
#defineERROR0
typedefstruct{/*建立一个栈的首结点*/
ELEMTYPE*base;
ELEMTYPE*top;
intstacksize;
}SpStack;
intInitStack(SpStack*s){/*建立空的栈并返回首地址*/
s->base=((ELEMTYPE*)malloc(STACK_INIT_SIZE*sizeof(ELEMTYPE)));
if(!s->base)returnERROR;
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
returnOK;
}
intStackEmpty(SpStack*s){/*判断栈是否为空*/
if(s->top==s->base)returnOK;
elsereturnERROR;
}
intPush(SpStack*s,ELEMTYPEe){/*往栈顶插入元素即进栈*/
if(s->top-s->base>=s->stacksize){/*判断是否栈满*/
s->base=((ELEMTYPE*)realloc(s->base,(s->stacksize+STACK_GROW_SIZE)*sizeof(ELEMTYPE)));
if(!s->base)returnERROR;
s->stacksize+=STACK_GROW_SIZE;
s->top=s->base+s->stacksize;
}
*s->top++=e;
returnOK;
}
intPop(SpStack*s,ELEMTYPE*e){/*让栈顶元素依次输出即出栈*/
if(StackEmpty(s))returnERROR;
*e=*(--s->top);
returnOK;
}
intComp(ELEMTYPEa,ELEMTYPEb){
if((a=='('&&b!=')')
||(a=='['&&b!=']')
||(a=='{'&&b!='}')){
returnERROR;
}elsereturnOK;
}
intCount(SpStack*s){
ELEMTYPEe[STACK_INIT_SIZE*2];
ELEMTYPEe1;
inti;
InitStack(s);
fgets(e,STACK_INIT_SIZE*2,stdin);
if('\n'==e[strlen(e)-1])e[strlen(e)-1]=0;
printf("%s\n",e);
for(i=0;e!='\0';i++){
switch(e){
case'(':
case'[':
case'{':
Push(s,e);
break;
case')':
case']':
case'}':
if(StackEmpty(s)){
printf("%*s↖右括号多余\n",i+1,"");
return(ERROR);
}elsePop(s,&e1);
if(!Comp(e1,e)){
printf("%*s↖左右匹配出错\n",i+1,"");
return(ERROR);
}
}
}
if(!StackEmpty(s)){
printf("%*s↖左括号多余\n",i,"");
return(ERROR);
}else{
printf("匹配正确\n");
return(OK);
}
}
voidmain(){
SpStacks;
Count(&s);
free(s.base);
}

回复

使用道具 举报

千问 | 2021-1-27 06:52:08 | 显示全部楼层
cout引用3楼ping1992216的回复:够用,用string也行,我后来就是用string的...
我最后发现问题是出现在:题目让用的是“[]”和"()"我用的是“{}”和“()”....哭瞎了

让你“哭瞎”后能“复明”,且今后减少“哭瞎”的可能性的本ID来了:
关于自己是否适合编程的很简单的测试:
在报纸或杂志上随便找一段约1000字的文章,在Word中输入一遍。输完后再参考下面答案:
A里面有10处以上文字或标点错误
B里面没有文字或标点错误并敢为此跟人打赌
C里面没有文字或标点错误并且字体和排版完全与原稿一致
D打印在半透明的纸上和原稿重叠在一起检查一模一样,且自我感觉很有成就感
A不适合编程(理由:打字准确度偏低、粗心大意)
B初级程序员(理由:打字准确度很高、认真细致、自信、理解全角半角概念)
C高级程序员(理由:在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证)
D软件项目经理(理由:能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业!)
如果想从A变成B的话,到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行