这是我之前做的,在tc上是可以的,因为atoi()(将字符转为数值)是tc的库函数,在c++6.0上会报错。其实很简单,自己写一个也可以。第一次运行的时候没有提示,所以忘了直接输入表达式回车就行了。基本思路就是利用栈把中缀表达式转为后缀表达式,然后求值。
#包括
#定义最大100
typedef long 数据类型;
类型定义 char chartype;
typedef 结构
数据类型数据[max];
int 顶部;
}numstack;/*对象栈用于存储操作对象*/
typedef 结构
chartype数据[max];
int top,y[max];/*y存储相应运算符的优先级*/
}stack;/*操作符栈用于存储操作符*/
int fenli(numstack *S,字符串[max],int i)
/* 从表达式中取出操作数,将其转换为值并存储在对象堆栈中*/
intj=0;
char st[100];/*st用于临时存储字符类型操作数*/
做
st[j]=字符串[i];i++;j++;
}while(string[i]>='0'&&string[i]top++;
S->data[S->top]=atoi(st);/*atoi用于将字符串转换成对应的值,并将转换后的值存放到对象堆栈中*/
j=0;
return(i);/*返回当前字符位置*/
int pipei(字符串[max])
/*验证括号是否匹配*/
堆栈*S;
int i=0;
S->top=0;/*初始化操作符堆栈*/
while(string[i]!='\0')
if(string[i]=='(')/*遇到'('时,将'('压入堆栈*/
S->顶部++;
S->数据[S->顶部]=字符串[i];
if(string[i]==')')/*遇到')'时检查栈顶是否为'(',是则弹出栈顶,否则如果括号不匹配则返回0*/
如果(S->数据[S->顶部]=='(')
S->顶部--;
否则返回(0);
我++;
if(S->top>0) return(0);/*判断操作符栈是否为空,如果不为空,则括号不匹配,返回0,如果为空,则括号匹配,返回1*/
否则返回(1);
void yunsuan(char 字符串[max])
数字堆栈*S;
int i=0;
S->top=0;/*初始化对象堆栈*/
while(string[i]!='\0')/*如果是结束字符,则结束循环*/
如果(string[i]>='0'&&string[i]data[S->top]);
int zhuanghuan(char s[max],char string[max])
/*将中缀表达式转换为后缀表达式*/
堆栈*S;
int i=0,j=0;
S->顶部=-1;
S->y[0]=0;/*初始化操作符堆栈*/
while(s[i]!='\0')/*遇到终止符则结束循环*/
如果(s[i]>='0'&&s[i]top++;
S->数据[S->顶部]='(';
S->y[S->top]=0;/*'('括号内优先级最低,括号外优先级最高*/
休息;
case ')':/*遇到')'时,从运算符栈中弹出运算符,直到遇到'(',则直接弹出'('*/
while(S->数据[S->顶部]!='(')
字符串[j]=S->数据[S->top];
S->顶部--;j++;
S->顶部——;中断;
案例‘+’:
案件 '-':{
string[j]=' ';/*将操作对象以间隔分隔*/
if(S->y[S->top]>=1)/*如果栈顶元素的优先级大于+-1的优先级,则弹出栈顶元素*/
字符串[j]=S->数据[S->顶部];
S->顶部--;
S->顶部++;
S->data[S->top]=s[i];/*将当前操作符+或-压入堆栈*/
S->y[S->top]=1;/*+-的优先级定义为1*/
j++;打破;
案件 '*':
案件 '/':
字符串[j]=' ';
if(S->y[S->top]>=2)/*如果栈顶元素的优先级大于或等于*或/的优先级,则从栈中弹出栈顶元素*/
字符串[j]=S->数据[S->顶部];
S->顶部--;
S->顶部++;
S->data[S->top]=s[i];/*将当前操作符*或/压入堆栈*/
S->y[S->top]=2;/*优先级定义为2*/
j++;打破;
我++;
while(S->top!=-1)/*如果栈不为空,则弹出,直到栈为空*/
字符串[j]=S->数据[S->top];S->top--;j++;
字符串[j]='\0';
printf("后缀表达式为:%s\n",string);
返回(1);
int 主要()
char 字符串[max],s[max],flag='1';
while(标志!='0')
打印(“”);
得到;
如果(管道)
如果(zhuanghuan(s,string))
yunsuan(字符串);
else printf("布皮佩");
printf("输入0结束,输入任意字符继续");
scanf("%c",&flag);