设计一个算法,判断表达式中左右括号是否成对,什么数据结构最好。
栈?(栈)是后进先出(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}
}