2个回答
展开全部
这个是我以前做的逆波兰表达式的程序,可以达到你的要求,你可以了解下:
#include <stdio.h>
#include <ctype.h>
#include<stdlib.h>
#define k 1000
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;
printf("逆波兰表达式的过程为:\n");
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];
for(int l=0;l<=*m;l++)
{
if (p[l][0]==0) printf("%d",p[l][1]);
else printf("%c",p[l][1]);
}
printf("\n");
(*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];
for(int l=0;l<=*m;l++)
{
if (p[l][0]==0) printf("%d",p[l][1]);
else printf("%c",p[l][1]);
}
printf("\n");
(*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];
for(int l=0;l<=*m;l++)
{
if (p[l][0]==0) printf("%d",p[l][1]);
else printf("%c",p[l][1]);
}
printf("\n");
(*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');
}
double evaluate(int p[][2],int m)
//对逆波兰表达式求值,p为逆波兰表达式,m为表达式长度
{
double stack[1000];//求值所用的栈
int depth;//栈的深度
int i;
depth=0;
printf("对逆波兰表达式求值的过程为:\n");
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;
printf("%.2f*%.2f=%.2f\n",a,b,a*b);
}
else if (p[i][0]==4)
{
stack[depth++]=a/b;
printf("%.2f/%.2f=%.2f\n",a,b,a/b);
}
else if (p[i][0]==5)
{
stack[depth++]=a+b;
printf("%.2f+%.2f=%.2f\n",a,b,a+b);
}
else
{
stack[depth++]=a-b;
printf("%.2f-%.2f=%.2f\n",a,b,a-b);
}
}
}
return stack[0];
}
int a[k][2];
int n;
int p[k][2];
int m;
void main()
{
printf("请输入一个表达式(请以#结尾):\n");
char text[200];
scanf("%s",text);
transform(text,a,&n);
poland(a,n,p,&m);
printf("这个逆波兰表达式为:\n");
print_poland(p,m);
printf("这个表达式的结果为: \n%.2f\n",evaluate(p,m));
system("pause");
return;
}
#include <stdio.h>
#include <ctype.h>
#include<stdlib.h>
#define k 1000
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;
printf("逆波兰表达式的过程为:\n");
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];
for(int l=0;l<=*m;l++)
{
if (p[l][0]==0) printf("%d",p[l][1]);
else printf("%c",p[l][1]);
}
printf("\n");
(*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];
for(int l=0;l<=*m;l++)
{
if (p[l][0]==0) printf("%d",p[l][1]);
else printf("%c",p[l][1]);
}
printf("\n");
(*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];
for(int l=0;l<=*m;l++)
{
if (p[l][0]==0) printf("%d",p[l][1]);
else printf("%c",p[l][1]);
}
printf("\n");
(*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');
}
double evaluate(int p[][2],int m)
//对逆波兰表达式求值,p为逆波兰表达式,m为表达式长度
{
double stack[1000];//求值所用的栈
int depth;//栈的深度
int i;
depth=0;
printf("对逆波兰表达式求值的过程为:\n");
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;
printf("%.2f*%.2f=%.2f\n",a,b,a*b);
}
else if (p[i][0]==4)
{
stack[depth++]=a/b;
printf("%.2f/%.2f=%.2f\n",a,b,a/b);
}
else if (p[i][0]==5)
{
stack[depth++]=a+b;
printf("%.2f+%.2f=%.2f\n",a,b,a+b);
}
else
{
stack[depth++]=a-b;
printf("%.2f-%.2f=%.2f\n",a,b,a-b);
}
}
}
return stack[0];
}
int a[k][2];
int n;
int p[k][2];
int m;
void main()
{
printf("请输入一个表达式(请以#结尾):\n");
char text[200];
scanf("%s",text);
transform(text,a,&n);
poland(a,n,p,&m);
printf("这个逆波兰表达式为:\n");
print_poland(p,m);
printf("这个表达式的结果为: \n%.2f\n",evaluate(p,m));
system("pause");
return;
}
更多追问追答
追问
执行有问题啊
追答
什么问题?
我这里运行了,没问题的
你是不是 输入的表达式没以 '#' 号结束?
当时做的时候表达式是要求用 '#' 号结束的
你看着适当改一改就好了
展开全部
#include<stdio.h>
void main()
{
int a,b;
char ch;
scanf("%d%c%d",&a,&ch,&b);
switch(ch)
{
case '+': printf("%d + %d = %d\n",a,b,a+b);
break;
case '-': printf("%d - %d = %d\n",a,b,a-b);
break;
case '*': printf("%d * %d = %d\n",a,b,a*b);
break;
case '/': printf("%d / %d = %d\n",a,b,a/b);
break;
}
}
void main()
{
int a,b;
char ch;
scanf("%d%c%d",&a,&ch,&b);
switch(ch)
{
case '+': printf("%d + %d = %d\n",a,b,a+b);
break;
case '-': printf("%d - %d = %d\n",a,b,a-b);
break;
case '*': printf("%d * %d = %d\n",a,b,a*b);
break;
case '/': printf("%d / %d = %d\n",a,b,a/b);
break;
}
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询