#include <stdio.h>
#include <ctype.h>
#include<stdlib.h>
#include<time.h>
void transform(char *str,int a[][2],int *n)
//将输入的字符串转化为格式化的数组以记录输入的表达式,str为输入的字符串,a为目标数组,n记录数组a的大小
{
int i;
*n=1;
a[0][0]=1;
a[0][1]='(';//在表达式首添加一个括号
for (i=0;str[i];)
{
if (isdigit(str[i]))
{
a[*n][0]=0;
a[*n][1]=0;
while (isdigit(str[i]))
{
a[*n][1]=a[*n][1]*10+str[i]-'0';
i++;
}
}
else
{
if (str[i]=='(') a[*n][0]=1;
else if (str[i]==')') a[*n][0]=2;
else if (str[i]=='*') a[*n][0]=3;
else if (str[i]=='/') a[*n][0]=4;
else if (str[i]=='+' || str[i]=='-')
{
if (i==0 || (!isdigit(str[i-1]) && str[i-1]!=')'))
{
a[*n][0]=0;
a[*n][1]=0;
(*n)++;
}
if (str[i]=='+') a[*n][0]=5;
else a[*n][0]=6;
}
a[*n][1]=str[i];
i++;
}
(*n)++;
}
a[*n][0]=2;
a[*n][1]=')';//在表达式尾添加一个反括号
(*n)++;
}
void poland(int a[][2],int n,int p[][2],int *m)
//将格式化数组转化为逆波兰表达式,a为输入的数组,n为其长度,p为输出逆波兰表达式的目标,m记录逆波兰表达式的长度
{
int i;
int stack[1000];//转化所用的栈
int depth;//栈的深度
depth=0;
*m=0;
for (i=0;i<n;i++)
{
if (a[i][0]==0) stack[depth++]=i;
else if (a[i][0]==1) stack[depth++]=i;
else if (a[i][0]==2)
{
while (a[stack[depth-1]][0]!=1)
{
depth--;
p[*m][0]=a[stack[depth]][0];
p[*m][1]=a[stack[depth]][1];
(*m)++;
}
depth--;
}
else if (a[i][0]==3 || a[i][0]==4)
{
while (a[stack[depth-1]][0]==0 || a[stack[depth-1]][0]==3 || a[stack[depth-1]][0]==4)
{
depth--;
p[*m][0]=a[stack[depth]][0];
p[*m][1]=a[stack[depth]][1];
(*m)++;
}
stack[depth++]=i;
}
else if (a[i][0]==5 || a[i][0]==6)
{
while (a[stack[depth-1]][0]!=1)
{
depth--;
p[*m][0]=a[stack[depth]][0];
p[*m][1]=a[stack[depth]][1];
(*m)++;
}
stack[depth++]=i;
}
}
}
void print_poland(int p[][2],int m)
//打印逆波兰表达式,p为逆波兰表达式,m为表达式长度
{
int i;
for (i=0;i<m;i++)
{
if (p[i][0]==0) printf("%d",p[i][1]);
else printf("%c",p[i][1]);
}
putchar('\n');
}
void evaluate(int p[][2],int m)
//对逆波兰表达式求值,p为逆波兰表达式,m为表达式长度
{
double stack[1000];//求值所用的栈
int depth;//栈的深度
int i;
depth=0;
for (i=0;i<m;i++)
{
if (p[i][0]==0) stack[depth++]=p[i][1];
else
{
double a,b;
b=stack[--depth];
a=stack[--depth];
if (p[i][0]==3) stack[depth++]=a*b;
else if (p[i][0]==4) stack[depth++]=a/b;
else if (p[i][0]==5) stack[depth++]=a+b;
else stack[depth++]=a-b;
}
}
if (stack[0]==24)
printf("true\n");
else
printf("false\n");
}
int a[1000][2];
int n;
int p[1000][2];
int m;
main()
{
int b[4],i;
char zu[30];
srand(time(NULL)); //产生四个随机数
for(i=0;i<4;i++)
{
b[i]=rand()%10+1;
}
printf("产生的四个随机数为\n");
for(i=0;i<4;i++)
printf("%4d ",b[i]);
printf("\n");
printf("请输入表达式\n");
scanf("%s",zu);
transform(zu,a,&n);
poland(a,n,p,&m);
print_poland(p,m);
evaluate(p,m);
return 0;
}
APei
- 粉丝: 83
- 资源: 1万+
最新资源
- 基于微信的垃圾分类小程序springboot.zip
- stm32驱动摄像头ov7670源程序
- 微信小程序评分小程序ssm.zip
- 基于微信小程序的在线学习系统springboot.zip
- 基于微信小程序的汽车销售系统的设计与实现springboot.zip
- 球馆预约系统ssm.zip
- 基于java的餐厅点餐系统微信小程序ssm.zip
- 基于微信小程序的走失人员的报备平台设计ssm.zip
- 基于微信小程序的社区门诊管理系统php.zip
- 基于微信小程序的新生报到系统的设计与实现ssm.zip
- 学生资助在线管理软件开发微信小程序ssm.zip
- 圣诞树html网页代码.zip
- unity 微信小游戏 文本内容检测
- 基于libos架构的操作系统核心库及构建工具
- springboot项目快速实现国际化 若依前后端分离版-快速国际化集成
- AigcPanel 是一个简单易用的一站式AI数字人系统,支持视频合成、声音合成、声音克隆,简化本地模型管理、一键导入和使用AI模型
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈