假如我可以飞作文400字:关于逆波兰法

来源:百度文库 编辑:神马品牌网 时间:2024/04/27 19:36:13
我想用C编一个带有括号的 计算器
请教关于逆波兰法计算的方法
比如3-4*5-(2-3*5)*(2-5)
按逆波兰法是怎么一步一步计算下去的

双数组逆波兰表达式法:计算器
见源程(c语言):
#include "stdio.h"
#define m0 100
void main(){
char str[m0];
char exp[m0];
char stack[m0];
float stack1[m0],d;
char ch,c;
int i,j,t,top=0;
i=0;
clrscr();
do
{
i++;
scanf("%c",&str[i]);
}while (str[i]!='#'&&i!=m0);
t=1;
i=1;
ch=str[i];
i++;
while(ch!='#')
{
if(ch>='0'&&ch<='9')
{
exp[t]=ch;
t++;
}
else
if(ch=='(')
{
top++;
stack[top]=ch;
}
else
if(ch==')')
{
while(stack[top]!='(')
{
exp[t]=stack[top];
top--;
t++;
}
top--;
}
else
if (ch=='+'||ch=='-')
{
while(top!=0&&stack[top]!='(')
{
exp[t]=stack[top];
top--;
t++;
}
top++;
stack[top]=ch;
}
else
if(ch=='*'||ch=='/')
{
while(stack[top]=='*'||stack[top]=='/')
{
exp[t]=stack[top];
top--;
t++;
}
top++;
stack[top]=ch;
}
ch=str[i];
i++;
}
while(top!=0)
{
exp[t]=stack[top];
t++;
top--;
}
exp[t]='#';
for(j=1;j='0'&&c<='9')
{
d=c-'0';
top++;
stack1[top]=d;
}
else
{
switch (c)
{
case '+':stack1[top-1]=stack1[top-1]+stack1[top];break;
case '-':stack1[top-1]=stack1[top-1]-stack1[top];break;
case '*':stack1[top-1]=stack1[top-1]*stack1[top];break;
case '/':
if(stack1[top]!=0)
stack1[top-1]=stack1[top-1]/stack1[top];
else
printf("ERROR!!! Zero can not be divided.\n");
getch();
exit(0);
}
top--;
}
c=exp[t];
t++;
}
printf("The mark is %g",stack1[top]);
getch();
}
例:
输入:1+2×(4+6)#;
程序将数据转换为中序,再输出:1246+*+#;
再计算.
输出21.