删除多余括号(源代码)
//删除多余括号
#include
#include
#define maxsize 100
typedef struct
{
char data[maxsize];//记录栈中数据
int top;//记录栈顶位置
}Stack;
Stack *InitStack()//初始栈函数
{
Stack *S;
S=(Stack *)malloc(sizeof(Stack));
S->top=-1;
return S;
}
int EmptyStack(Stack *S)//判栈空函数
{
if(S->top<=-1)
return 1;
else
return 0;
}
int FullStack(Stack *S)//判栈满函数
{
if(S->top>=maxsize)
return 1;
else
return 0;
}
Stack *Pop(Stack *S)//元素出栈函数
{
if(!EmptyStack(S))
{
S->top--;
}
return S;
}
Stack *Push(Stack *S,char Data)//元素入栈函数
{
if(!FullStack(S))
{
S->top++;
S->data[S->top]=Data;
}
return S;
}
void PrintStack(Stack *S)//遍历栈函数
{
if(EmptyStack(S))
{
printf("此栈为空,无法输出!");
}
else
{
while(S->top>-1)
{
S=Pop(S);
printf("%c",S->data[S->top+1]);
}
}
}
void main()
{
Stack *S1,*S2;
char s[100],c;
int i=-1,j,k,m,n;
S1=InitStack();
S2=InitStack();
printf("请输入一个四则运算表达式:\n");
scanf("%c",&c);
while(c!='#')//输入一个四则运算表达式
{
i++;
s[i]=c;
scanf("%c",&c);
}
for(j=0;j<=i;j++)
{
if(s[j]=='(')//考虑左括号
{
if(s[j+2]==')')//若括号里只有一个字符,删除括号
{
j++;
S1=Push(S1,s[j]);
j++;
}
else if(s[j+3]==')')
{
if(s[j+1]=='-')//若与左括号相邻的是负号
{
for(k=0;k<4;k++)
{
S1=Push(S1,s[j]);
j++;
}
}
else
{
for(k=0;k<2;k++)
{
j++;
S1=Push(S1,s[j]);
}
j++;
}
}
else if(j-1==-1)//若第一个字符是左括号
{
S1=Push(S1,s[j]);
}
else if(j-1>=0)//若第一个字符不是左括号
{
if(s[j-1]=='/')
{
S1=Push(S1,s[j]);
}
else if((s[j-1]=='*'||s[j-1]=='-')&&(s[j+2]=='+'||s[j+2]=='-')||s[j+1]=='-')
{
for(;s[j]!=')';j++)
{
S1=Push(S1,s[j]);
}
S1=Push(S1,s[j]);
}
else
{
for(;s[j]!=')';j++)
{
S1=Push(S1,s[j]);
}
j--;
}
}
}
else if(s[j]==')')//考虑右括号
{
if(j==i)
{
S1=Push(S1,s[j]);
}
else if((s[j-2]=='+'||s[j-2]=='-')&&(s[j+1]=='*'||s[j+1]=='/'))
{