#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
- 粉丝: 78
- 资源: 1万+
最新资源
- stm32f1 PWM控制蜂鸣器频率仿真
- 基于微信平台的ssm农产品自主供销小程序 (源码 + 数据库+LW+PPT)
- ASM1042A型can-fd单粒子效应脉冲激光
- SCH_Schematic1_2024-10-08.pdf
- 基于微信平台的ssm面向企事业单位的项目申报小程序 (源码 + 数据库+LW+PPT)
- 带闹钟功能、数字按键、扬声器等的计时器VIVADO设计工程源代码
- python考核.py
- 基于微信平台的springboot驾校报名小程序 (源码 + 数据库+LW+PPT)
- Cosmic的C和汇编语言工具链
- 基于微信平台的ssm游泳馆管理系统小程序(源码 + 数据库+LW+PPT)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈