表达式求值源代码(数据结构课程设计)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
flog=1;
printf("\n\n\n");
}
break;
case '2':
if(flog==0)
{
printf("您还没有输入过表达式!\n请您按照规定先输入后判断!\n\n\n");
}
else
{
flog2=1;
if(judge(a))
{
printf("表达式符合要求!\n您可以继续下面的操作!\n");
b[0]++;
}
else if('0'<=a[i]&&a[i]<='9')
{
b[1]++;
}
else if(a[i]=='(')
{
b[2]++;
}
else if(a[i]==')')
{
b[3]++;
}
else
b[4]++;
if(b[4]!=0)
{
flog=0;
break;
}
else if(a[i]=='/'&&a[i+1]=='0')
数据结构课程设计源代码:表达式求值
0900340131张宁2011.6.26
#include<stdio.h>
#include<stdlib.h>
/*函数功能:将数字字符串转变成相应的数*/
/*函数参数:char类型数组f,指向int类型变量的指针i*/
/*函数返回值:int类型。返回数字字符串对应的数*/
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("版权所有,盗版必究张宁2010/6/24 \n\n\n");
do
{
printf("请输入您要操作所对应的数字:");
fflush(stdin);
top++; /*指向栈顶的指针*/
while(e[i]!='#') /*遍历中缀表达式的全部字符*/
{
if(e[i]>='0'&&e[i]<='9') /*如果是数字字符,则将其存放在数组f中*/
{
f[j++]=e[i];
}
else if(e[i]=='(') /*如果是'('的话,将其压入到操作符栈中*/
{
printf("您还没有判断表达式的正确性!\n请您按照规定先判断表达式的正确性后查看算术表达式的中缀表达式\n\n\n");
break;
}
else
{ /*postfix(a,b);*/
result=evalpost(b);
printf("运算结果为:");
for(i=0;a[i]!='#';i++)
scanf("%c",&w);
if(w=='n')
{
printf("您的操作已取消!\n\n\n");
break;
}
else if(w=='y')
{
printf("请输入算术表达式:(以#号结尾!) ");
i=0;
do
{
scanf("%c",&a[i]);
}while(a[i++]!='#');
flog=1;
printf(" 1代表输入算术表达式\n");
printf(" 2代表判断输入的算术表达式的正确性\n");
printf(" 3代表查看算术表达式的中缀表达式\n");
printf(" 4代表查看算术表达式的后缀表达式\n");
printf(" 5代表给出输入的算术表达式的最终结果\n");
printf("规定:第一步必须先输入算术表达式,然后才能进行其他的操作\n");
printf("\n\n\n");
break;
}
else
{
printf("请输入正确的选项!\n");
}
}while(w!='n'&&w!='y');
}
else
{
printf("请输入算术表达式:(以#号结尾!) ");
do
{
scanf("%c",&a[i]);
}while(a[i++]!='#');
int readnumber(char f[],int *i)
{
int x=0;
while(f[*i]>='0'&&f[*i]<='9') /*判断字符是否为数字字符*/
{
x=x*10+(f[*i]-'0'); /*将数字字符转化成为整数*/
(*i)++; /*此处对i的修改将会保留下来*/
}
return x;
/*函数返回值:int类型。1代表正确,0代表错误*/
int judge(char * a)
{
int i=0,flog=1, b[5]={0}; //x1记录运算符的个数,
while(a[i]!='#')
{
if(a[i]=='+'||a[i]=='-'||a[i]=='/'||a[i]=='*')
{
}
top--; /* '('出栈*/
}
else if(is_operation(e[i])) /* '+,-,*,/' */
{
f[j++]=' '; /*用空格分开两个操作数*/
while(priority(opst[top-1])>=priority(e[i])) /*判断数组e和栈顶的操作符的优先级,大的,赋值给数组f*/
{
i++;
}
else if(f[i]=='+') /*如果字符是运算符'+',则从操作数栈中取出两个元素进行相加*/
{
x2=obst[--top];
x1=obst[--top];
obst[top]=x1+x2; /*将运算结果入栈*/
top++;
i++;/*继续下一个字符*/
}
else if(f[i]=='-') /*如果字符是运算符'-',则从操作数栈中取出两个元素进行相减*/
char a[100],b[100],x,w; /*数组a用来保存中缀表达式,数组b用来表达后缀表达式,*/
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf(" 0代表退出系统\n");
{
x2=obst[--top];
x1=obst[--top];
obst[top]=x1-x2;/*将运算结果入栈*/
top++;
i++;/*继续下一个字符*/
}
else if(f[i]=='*') /*如果字符是运算符'*',则从操作数栈中取出两个元素进行相乘*/
{
x2=obst[--top];
x1=obst[--top];
}
/*函数功能:求一个后缀表达式的值*/
/*函数参数:char类型的数组f */
/*函数返回值:int类型。返回后缀表达式的值*/
int evalpost(char f[]) /*参数数组f是存放后缀表达式的数组*/
{
int obst[100]; /*操作数栈*/
int top=0,i=0;
int x1,x2; /*x1,x2分别存放运算符前后的整数数字*/
{
switch(op)
{
case '+':
case '-':
case '*':
case '/':return 1;
default:return 0;
}
}
/*函数功能:求运算符的优先级*/
/*函数参数:char类型变量op */
/*函数返回值:int类型。返回各中运算符的优先级*/
int priority(char op)
{
flog=0;
break;
}
else if(b[1]-b[0]!=1)
{
flog=0;
break;
}
else if(b[2]!=b[3])
{
flog=0;
break;
}
}
/*return flog;*/
}
/*函数功能:将一个中缀表达式e转换为与它等价的后缀表达式f*/
/*函数参数:char类型数组变量e和f */
{
opst[top++]=e[i];
}
else if(e[i]==')') /*如果是')'的话,则将从')'到'('中的所有的运算符全部出栈*/
{
t=top-1;
while(opst[t]!='(')
{
f[j++]=opst[--top]; /*出栈的运算符全部加入到数组f中去*/
t=top-1;
}
else
{
printf("表达式不符合要求!\n请重新输入!\n");
break;
}
}
break;
case '3':
if(flog==0)
{
printf("您还没有输入过表达式!\n请您按照规定先输入后算术表达式的中缀表达式\n\n\n");
break;
}
else if(flog2==0)
{
printf("您还没有判断表达式的正确性!\n请您按照规定先判断表达式的正确性后查看算术表达式的中缀表达式\n\n\n");
break;
}
else if(flog2==0)
{
printf("您还没有判断表达式的正确性!\n请您按照规定先判断表达式的正确性后查看算术表达式的中缀表达式\n\n\n");
break;
}
else
{
postfix(a,b);
printf("后缀表达式为:\n");
i=0;
do
{
printf("%c",b[i]);
/*函数返回值:无*/
void postfix(char e[],char f[])/*数组e中存放的是中缀表达式;数组f中存放的是后缀表达式*/
{
int i=0,j=0,top=0,t;
char opst[100]; /*操作符栈*/
opst[top]='#'; /*一开始时,栈顶的元素为'#'*/
obst[top]=x1*x2;/*将运算结果入栈*/
top++;
i++;/*继续下一个字符*/
}
else if(f[i]=='/') /*如果字符是运算符'/',则从操作数栈中取出两个元素进行相除*/
{
x2=obst[--top];
x1=obst[--top];
obst[top]=x1/x2;/*将运算结果入栈*/
{
printf("%c",a[i]);
}
printf("=%d\n\n\n",result);
}
break;
}
}
else
{
printf("没有此项操作,请重新输入!\n\n\n");
}
}while(x!='0');
scanf("%c",&x);
if(48<=x&&x<=53)
{
switch(x)
{
case '1':
if(flog==1)
{
printf("您已经输入过表达式了!进行此操作需要重新输入,请问你是否要继续操作!\n");
printf("继续,请输入y;\n返回,请输入n\n");
do
{
fflush(stdin); /*清楚缓存中的回车*/
top++;
i++;/*继续下一个字符*/
}
}
return obst[0];/*最后栈中只剩下一个元素,即为后缀表达式的值*/
}
/*函数功能:判断一个字符是否为运算符*/
/*函数参数:char类型变量op */
/*函数返回值:int类型。返回1表示op是运算符,否则不是*/
int is_operation(char op)
}while(b[i++]!='#'); /*i++;*/
printf("\n\n\n");
}
break;Leabharlann Baidu
case '5':
fflush(stdin);
if(flog==0)
{
printf("您还没有输入过表达式!\n请您按照规定先输入表达式\n\n\n");
break;
}
else if(flog2==0)
while(f[i]!='#') /*#为结束标志*/
{
if(f[i]>='0'&&f[i]<='9') /*字符如果是数字字符*/
{
obst[top]=readnumber(f,&i); /*调用函数将其转化成整型*/
top++; /*入栈*/
}
else if(f[i]==' ') /*遇到空格,跳过去,不进行处理*/
{
f[j++]=opst[--top];
}
opst[top]=e[i];
top++; /*当前元素进栈*/
}
i++; /*处理下一个元素*/
}
while(top) /*栈中还有的全部运算符赋值到数组f中,包括'#'*/
{
f[j++]=opst[--top];
}
}
main()
{
int i=0,result,flog=0,flog2=0;
break;
}
else
{
printf("中缀表达式为:");
i=0;
do
{
printf("%c",a[i]);
}while(a[i++]!='#'); /*i++;*/
printf("\n\n\n");
}
break;
case '4':
if(flog==0)
{
printf("您还没有输入过表达式!\n请您按照规定先输入后算术表达式的中缀表达式\n\n\n");
{
switch(op)
{
case '#':return -1;
case '(':return 0;
case '+':
case '-':return 1;
case '*':
case '/':return 2;
default:return -1;
}
}
/*函数功能:判断该表达式是符合要求*/
/*函数参数:存放从键盘输入的表达式*/
printf("\n\n\n");
}
break;
case '2':
if(flog==0)
{
printf("您还没有输入过表达式!\n请您按照规定先输入后判断!\n\n\n");
}
else
{
flog2=1;
if(judge(a))
{
printf("表达式符合要求!\n您可以继续下面的操作!\n");
b[0]++;
}
else if('0'<=a[i]&&a[i]<='9')
{
b[1]++;
}
else if(a[i]=='(')
{
b[2]++;
}
else if(a[i]==')')
{
b[3]++;
}
else
b[4]++;
if(b[4]!=0)
{
flog=0;
break;
}
else if(a[i]=='/'&&a[i+1]=='0')
数据结构课程设计源代码:表达式求值
0900340131张宁2011.6.26
#include<stdio.h>
#include<stdlib.h>
/*函数功能:将数字字符串转变成相应的数*/
/*函数参数:char类型数组f,指向int类型变量的指针i*/
/*函数返回值:int类型。返回数字字符串对应的数*/
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("版权所有,盗版必究张宁2010/6/24 \n\n\n");
do
{
printf("请输入您要操作所对应的数字:");
fflush(stdin);
top++; /*指向栈顶的指针*/
while(e[i]!='#') /*遍历中缀表达式的全部字符*/
{
if(e[i]>='0'&&e[i]<='9') /*如果是数字字符,则将其存放在数组f中*/
{
f[j++]=e[i];
}
else if(e[i]=='(') /*如果是'('的话,将其压入到操作符栈中*/
{
printf("您还没有判断表达式的正确性!\n请您按照规定先判断表达式的正确性后查看算术表达式的中缀表达式\n\n\n");
break;
}
else
{ /*postfix(a,b);*/
result=evalpost(b);
printf("运算结果为:");
for(i=0;a[i]!='#';i++)
scanf("%c",&w);
if(w=='n')
{
printf("您的操作已取消!\n\n\n");
break;
}
else if(w=='y')
{
printf("请输入算术表达式:(以#号结尾!) ");
i=0;
do
{
scanf("%c",&a[i]);
}while(a[i++]!='#');
flog=1;
printf(" 1代表输入算术表达式\n");
printf(" 2代表判断输入的算术表达式的正确性\n");
printf(" 3代表查看算术表达式的中缀表达式\n");
printf(" 4代表查看算术表达式的后缀表达式\n");
printf(" 5代表给出输入的算术表达式的最终结果\n");
printf("规定:第一步必须先输入算术表达式,然后才能进行其他的操作\n");
printf("\n\n\n");
break;
}
else
{
printf("请输入正确的选项!\n");
}
}while(w!='n'&&w!='y');
}
else
{
printf("请输入算术表达式:(以#号结尾!) ");
do
{
scanf("%c",&a[i]);
}while(a[i++]!='#');
int readnumber(char f[],int *i)
{
int x=0;
while(f[*i]>='0'&&f[*i]<='9') /*判断字符是否为数字字符*/
{
x=x*10+(f[*i]-'0'); /*将数字字符转化成为整数*/
(*i)++; /*此处对i的修改将会保留下来*/
}
return x;
/*函数返回值:int类型。1代表正确,0代表错误*/
int judge(char * a)
{
int i=0,flog=1, b[5]={0}; //x1记录运算符的个数,
while(a[i]!='#')
{
if(a[i]=='+'||a[i]=='-'||a[i]=='/'||a[i]=='*')
{
}
top--; /* '('出栈*/
}
else if(is_operation(e[i])) /* '+,-,*,/' */
{
f[j++]=' '; /*用空格分开两个操作数*/
while(priority(opst[top-1])>=priority(e[i])) /*判断数组e和栈顶的操作符的优先级,大的,赋值给数组f*/
{
i++;
}
else if(f[i]=='+') /*如果字符是运算符'+',则从操作数栈中取出两个元素进行相加*/
{
x2=obst[--top];
x1=obst[--top];
obst[top]=x1+x2; /*将运算结果入栈*/
top++;
i++;/*继续下一个字符*/
}
else if(f[i]=='-') /*如果字符是运算符'-',则从操作数栈中取出两个元素进行相减*/
char a[100],b[100],x,w; /*数组a用来保存中缀表达式,数组b用来表达后缀表达式,*/
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf(" 0代表退出系统\n");
{
x2=obst[--top];
x1=obst[--top];
obst[top]=x1-x2;/*将运算结果入栈*/
top++;
i++;/*继续下一个字符*/
}
else if(f[i]=='*') /*如果字符是运算符'*',则从操作数栈中取出两个元素进行相乘*/
{
x2=obst[--top];
x1=obst[--top];
}
/*函数功能:求一个后缀表达式的值*/
/*函数参数:char类型的数组f */
/*函数返回值:int类型。返回后缀表达式的值*/
int evalpost(char f[]) /*参数数组f是存放后缀表达式的数组*/
{
int obst[100]; /*操作数栈*/
int top=0,i=0;
int x1,x2; /*x1,x2分别存放运算符前后的整数数字*/
{
switch(op)
{
case '+':
case '-':
case '*':
case '/':return 1;
default:return 0;
}
}
/*函数功能:求运算符的优先级*/
/*函数参数:char类型变量op */
/*函数返回值:int类型。返回各中运算符的优先级*/
int priority(char op)
{
flog=0;
break;
}
else if(b[1]-b[0]!=1)
{
flog=0;
break;
}
else if(b[2]!=b[3])
{
flog=0;
break;
}
}
/*return flog;*/
}
/*函数功能:将一个中缀表达式e转换为与它等价的后缀表达式f*/
/*函数参数:char类型数组变量e和f */
{
opst[top++]=e[i];
}
else if(e[i]==')') /*如果是')'的话,则将从')'到'('中的所有的运算符全部出栈*/
{
t=top-1;
while(opst[t]!='(')
{
f[j++]=opst[--top]; /*出栈的运算符全部加入到数组f中去*/
t=top-1;
}
else
{
printf("表达式不符合要求!\n请重新输入!\n");
break;
}
}
break;
case '3':
if(flog==0)
{
printf("您还没有输入过表达式!\n请您按照规定先输入后算术表达式的中缀表达式\n\n\n");
break;
}
else if(flog2==0)
{
printf("您还没有判断表达式的正确性!\n请您按照规定先判断表达式的正确性后查看算术表达式的中缀表达式\n\n\n");
break;
}
else if(flog2==0)
{
printf("您还没有判断表达式的正确性!\n请您按照规定先判断表达式的正确性后查看算术表达式的中缀表达式\n\n\n");
break;
}
else
{
postfix(a,b);
printf("后缀表达式为:\n");
i=0;
do
{
printf("%c",b[i]);
/*函数返回值:无*/
void postfix(char e[],char f[])/*数组e中存放的是中缀表达式;数组f中存放的是后缀表达式*/
{
int i=0,j=0,top=0,t;
char opst[100]; /*操作符栈*/
opst[top]='#'; /*一开始时,栈顶的元素为'#'*/
obst[top]=x1*x2;/*将运算结果入栈*/
top++;
i++;/*继续下一个字符*/
}
else if(f[i]=='/') /*如果字符是运算符'/',则从操作数栈中取出两个元素进行相除*/
{
x2=obst[--top];
x1=obst[--top];
obst[top]=x1/x2;/*将运算结果入栈*/
{
printf("%c",a[i]);
}
printf("=%d\n\n\n",result);
}
break;
}
}
else
{
printf("没有此项操作,请重新输入!\n\n\n");
}
}while(x!='0');
scanf("%c",&x);
if(48<=x&&x<=53)
{
switch(x)
{
case '1':
if(flog==1)
{
printf("您已经输入过表达式了!进行此操作需要重新输入,请问你是否要继续操作!\n");
printf("继续,请输入y;\n返回,请输入n\n");
do
{
fflush(stdin); /*清楚缓存中的回车*/
top++;
i++;/*继续下一个字符*/
}
}
return obst[0];/*最后栈中只剩下一个元素,即为后缀表达式的值*/
}
/*函数功能:判断一个字符是否为运算符*/
/*函数参数:char类型变量op */
/*函数返回值:int类型。返回1表示op是运算符,否则不是*/
int is_operation(char op)
}while(b[i++]!='#'); /*i++;*/
printf("\n\n\n");
}
break;Leabharlann Baidu
case '5':
fflush(stdin);
if(flog==0)
{
printf("您还没有输入过表达式!\n请您按照规定先输入表达式\n\n\n");
break;
}
else if(flog2==0)
while(f[i]!='#') /*#为结束标志*/
{
if(f[i]>='0'&&f[i]<='9') /*字符如果是数字字符*/
{
obst[top]=readnumber(f,&i); /*调用函数将其转化成整型*/
top++; /*入栈*/
}
else if(f[i]==' ') /*遇到空格,跳过去,不进行处理*/
{
f[j++]=opst[--top];
}
opst[top]=e[i];
top++; /*当前元素进栈*/
}
i++; /*处理下一个元素*/
}
while(top) /*栈中还有的全部运算符赋值到数组f中,包括'#'*/
{
f[j++]=opst[--top];
}
}
main()
{
int i=0,result,flog=0,flog2=0;
break;
}
else
{
printf("中缀表达式为:");
i=0;
do
{
printf("%c",a[i]);
}while(a[i++]!='#'); /*i++;*/
printf("\n\n\n");
}
break;
case '4':
if(flog==0)
{
printf("您还没有输入过表达式!\n请您按照规定先输入后算术表达式的中缀表达式\n\n\n");
{
switch(op)
{
case '#':return -1;
case '(':return 0;
case '+':
case '-':return 1;
case '*':
case '/':return 2;
default:return -1;
}
}
/*函数功能:判断该表达式是符合要求*/
/*函数参数:存放从键盘输入的表达式*/