算法思想
数学表达式中括号必须成对出现,比如(a+b)c、a(ln(x)-x)。否则即为不合法的表达式,如a*(b+c*(d+1)。
基于一个’(‘必须有与之对应的’)‘的思想,可以用栈来判断表达式是否合法。
让表达式中字符逐一入栈,每个’)‘可以带走一个’(’,判断最后’(‘是否被带完,且栈空时没有遇到’)’
代码
#include<stdio.h>
#include <stdlib.h>
#define maxsize 100//表达式的最大长度
/*函数原型声明*/
void find_elsment(char exp[],int n);//找到表达式(字符串)中的括号
int match(char exp[],int n);//判断括号使用是否合法
int main()
{
char exp[maxsize];
printf("请输入表达式:");
scanf("%s", exp);
printf("你输入的是:%s\n", exp);
find_elsment(exp,maxsize);
printf("exp=");
for(int i=0;i<18;i++)
printf("%c",exp[i]);
int result=match(exp,maxsize);
if(result==1)
printf("\nExp is right!\n");
else
printf("\nExp is wrong!\n");
system("pause");
return 0;
}
int match(char exp[],int n)
{
//初始化栈
char stack[maxsize];
int top=-1;
//遍历表达式,遇到'('则入栈,遇到')'则让栈顶的'('出栈,栈空时遇到')'则返回0
for(int i=0;i<n;++i)
{
if(exp[i]=='(')
stack[++top]='(';
if(exp[i]==')')
{
if(top==-1)
return 0;
else
--top;
}
}
if(top==-1)//栈空
return 1;
else
return 0;
}
void find_elsment(char exp[],int n)
{
int count=0;
//遍历字符串,如果是括号则保留,否则移除并把之后的元素前移
for(int i=0;i<n-count;i++)
{
if(exp[i]!='('&&exp[i]!=')')
{
for(int j=i;j<n-count;j++)//后面所有元素前移
{
exp[j]=exp[j+1];
}
i--;
count++;
}
}
printf("不是括号的字符个数count=%d\n",count);
//把尾部的乱码删掉
for(int i=1;i<=count;i++)
exp[n-i]=NULL;
}