设计一个算法,判断表达式中左右括号是否成对,什么数据结构最好。

用“栈”?这个数据结构。

栈?(栈)是后进先出(last?在?首先?Off,LIFO)数据结构。

算法的基本思想是:依次判断表达式中的每个字符,如果是左括号,就放入栈中,如果是右括号,就判断是否为空,如果为空,就表示不对,最后当表达式末尾没有字符时,就判断栈是否为空,如果为空,就表示匹配,如果不为空,就表示不匹配。

参考以下代码,参考地址(/kkkkkxiaofei/article/details/8293980)。

#包含?& ltstdio.h & gt

#包含?& ltmalloc.h & gt//malloc,realloc

#包含?& ltmath.h & gt?//包含溢出

#包含?& ltprocess.h & gt?//退出()

#定义?S_SIZE?100//栈的空间大小

#定义?STACKINCREAMENT?10//增加空间

struct?SQL stack {

int?*基数;?//堆栈底部

int?* top?//栈顶

int?stacksize//堆栈的当前存储空间

};

作废?主()

{//子函数声明

作废?InitStack(SqStack?& amps);//初始化空堆栈

int?StackEmpty(SqStack?s);//空句子

作废?推送(SqStack?& amps,int?e);//到堆栈中

作废?pop(SqStack?& amps,int?& ampe);//退出堆栈

//主函数的开始

SqStack?s;//初始化空堆栈

InitStack

夏尔?ch[100],* p;int?e;

p = ch

Printf("输入一个括号表达式,其含义为()[]{ }:\ n ");

gets(ch);

while(*p)

{?

切换?(*p)

{

案子?'{':

案子?'[':

案子?'(':?push(s,* p++);打破;//只要是左括号,就会放到堆栈上。

案子?'}':

案子?']':

案子?)’:pop(s,e);

?如果?((e=='{ '?& amp& amp?*p=='} ')?||(e=='['?& amp& amp?*p==']')?||?(e== '('?& amp& amp?*p== ')'))

?p++;

?其他

?{printf("括号不匹配!");退出(溢出);}

?打破;

违约?:p++;//其他字符后移。

}

}

如果?(堆栈属性)

Printf("括号匹配成功");

其他

Printf("缺少右括号!");

printf(" \ n ");

}

作废?InitStack(SqStack?& amps)

{S.base=(int?*)malloc(S _ SIZE * sizeof(int));

S.stacksize = S _ SIZE

s . top = s . base;//初始化空堆栈

}

int?StackEmpty(SqStack?s)

{

if(S.base==S.top)

回归?1;

其他

回归?0;

}

作废?推送(SqStack?& amps,int?e)

{//进入堆栈

if(s . top-s . base & gt;=S.stacksize)

{S.base=(int?*)realloc(S.base,(s . stack size+stack increament)* sizeof(int));

s . top = s . base+s . stack size;

s . stack size+= stack increation;}

*(s . top)= e;

s . top++;?

}

作废?pop(SqStack?& amps,int?& ampe)

{//离开堆栈

如果(S.base!=S.top)

{ s . top-;

e = * S.top}

}