小弟初来乍到,向各路高手致敬
栈的表达式计算大佬们这个程序怎么改进啊,改进一点点就行啊,谢谢
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
//此程序中存储单元采用malloc( )函数分配,但没有涉及处理溢出的问题,相关涉及可以参//照realloc( )的使用方法
//顺序栈的存储定义
typedef struct stack
{
char *base;//栈底指针
char *top;//栈顶指针
int stacksize;//栈分配的存储空间大小
}SqStack;
typedef struct stack2
{
int *base;//栈底指针
int *top;//栈顶指针
int stacksize;//栈分配的存储空间大小
}SqStack2;
void Menu();
void trans(char str[],char rpn[]);
int value(char rpn[]);
int Match(char *p);
//*****************************************************************************
void Menu()
{//界面函数
printf("*********表达式求值(只能包含+、-、*、/、()和正整数)********* ******\n");
printf("请选择:1.输入表达式 2.括号匹配检查 3.转换后缀表达式 4.表达式计算5.退出\n");
}
//*****************************************************************************
int Match(char *p)
{//检查表达式中小括号是否匹配
int flag=0;
SqStack s;
s.base=s.top=(char*)malloc(MAXSIZE*sizeof(char));
if(!s.base) exit(-2);
s.stacksize=MAXSIZE;
while(*p!='\0')
{
if(*p== '(')
{ if(s.top-s.base ==s.stacksize) exit(-1);
else {*s.top=*p;
s.top++;//将所有的左括号入栈
}
}
if(*p== ')')
{ if(s.top!=s.base&&*(s.top-1)=='(') {
s.top--;
flag=1; }
else flag=2;}
p++;
}//while
if((flag==1||flag==0)&&s.top==s.base)
{s.top=s.base;//将栈清空
return 1;}
else if(flag==2) {s.top=s.base;//将栈清空
return 0;}
}//Match
//*****************************************************************************
void trans(char str[],char rpn[])
{//将中缀表达式转换为后缀表达式
char ch;
int i=0,t=0;
SqStack s1,s2;
s1.base=s1.top=(char *)malloc(MAXSIZE*sizeof(char));
if(s1.base==NULL) exit(-2);
s2.base=s2.top=rpn;
s1.stacksize=s2.stacksize=MAXSIZE;
ch=str[i];
i++;
while(ch!='\0')
{ switch(ch)
{ case '(': *s1.top++=ch; break;
case ')': while(*(s1.top-1)!='(')
{ *(s2.top++)=*(s1.top-1);
s1.top--;
t++;
}
s1.top--;//此处必须再次进行--运算,才能忽略已经进入的'('
break;
case '+':
case '-':
while(s1.top!=s1.base && *(s1.top-1)!='(')
{*(s2.top++)=*(s1.top-1);
s1.top--;
}
*s1.top++=ch;
break;
case '*':
case '/':
while(*(s1.top-1)=='*'||*(s1.top-1)=='/')
{*(s2.top++)=*(s1.top-1);
s1.top--;
}
*s1.top++=ch;
break;
case ' ':break;
default:
while(ch>='0'&&ch<='9')
{*(s2.top++)=ch;
ch=str[i];
i++;
}
i--;
*(s2.top++)='#';
}//switch
ch=str[i];
i++;
}//while
while(s1.top!=s1.base)
{*(s2.top++)=*(s1.top-1);
t++;
s1.top--;
}//while
*(s2.top++)='\0';
}//trans
//*****************************************************************************
int value(char rpn[ ])
{//后缀表达式求值
int d;
char ch;
int t=0;
SqStack2 st;//st用来存放数值
st.base=st.top=(int *)malloc(MAXSIZE*sizeof(int));
if(st.base==NULL) exit(-2);
st.stacksize=MAXSIZE;
ch=rpn[t];
while(ch!='\0')
{
switch(ch)
{case '+':
*(st.top-2)=*(st.top-2) + *(st.top-1);
st.top--;
break;
case '-':
*(st.top-2)=*(st.top-2) - *(st.top-1);
st.top--;
break;
case '*':
*(st.top-2)=*(st.top-2) * *(st.top-1);
st.top--;
break;
case '/':
if(*(st.top-1)!=0)
*(st.top-2)=*(st.top-2) / *(st.top-1);
else
{printf("\n除0错误!\n");
exit(0);
}
st.top--;
break;
case '#':
t++;
break;
default:
d=0;
while(ch>='0'&&ch<='9')
{
d=10*d+ch-'0';
t++;
ch=rpn[t];
}
*(st.top++)=d;
}//switch
t++;
ch=rpn[t];
}//while
return *(st.top-1);
}//value
//*****************************************************************************
int main()
{//主函数
char str[MAXSIZE],rpn[MAXSIZE],f;
//str数组用来存储接收到的字符串,rpn用来存放转换出来的后缀表达式
int i,j=0,g;
Menu();
while(1)
{
scanf("%d",&g);
switch(g)
{
case 1: printf("请输入表达式:");
scanf("%s",str);
break;
case 2: i=Match(str);
if(i==1) printf("匹配成功!\n");
else printf("匹配失败!\n");
break;
case 3: if(i==1)
{trans(str,rpn);
printf("后缀表达式为:%s\n", rpn);
j=1;}
else
{j=0;
printf("表达式中括号匹配错误!\n");}
break;
case 4:
if(j) printf("计算结果为:%d\n",value(rpn));
else printf("后缀表达式转换遇到问题!\n");
break;
case 5: printf("确定要退出系统吗?(y/n)\n");
getchar();f=getchar();
if(f=='y'||f=='Y') exit(0);
else {printf("请重新选择!\n");break;}
default:printf("输入错误!\n");
exit(1);
}//switch
}//while
return 0;
}//main