把中缀表达式转换为后缀表达式的算法我需要用html和javascript实现一个科学计算器的全部功能包括三角函数等常用函数,现在需要有把中缀表达式转换为后缀表达式的方法,希望有具体的解释,
来源:学生作业帮助网 编辑:作业帮 时间:2024/08/27 06:03:44
把中缀表达式转换为后缀表达式的算法我需要用html和javascript实现一个科学计算器的全部功能包括三角函数等常用函数,现在需要有把中缀表达式转换为后缀表达式的方法,希望有具体的解释,
把中缀表达式转换为后缀表达式的算法
我需要用html和javascript实现一个科学计算器的全部功能包括三角函数等常用函数,现在需要有把中缀表达式转换为后缀表达式的方法,希望有具体的解释,或者能提供教程也行.最好把计算机识别后缀表达式的原理解释一下,分数不多,不成敬意.
把中缀表达式转换为后缀表达式的算法我需要用html和javascript实现一个科学计算器的全部功能包括三角函数等常用函数,现在需要有把中缀表达式转换为后缀表达式的方法,希望有具体的解释,
include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define MaxStackSize 100
#define M 100
typedef char DataType;
#include "SeqStack.h"
#include "implement.c"
/////////////////////////////计算表达式/////////////////////////////////
void EvaluateExpression(char *exp)
{
char c;
char theta;
char tmpc,a,b,y;
//char x,ch;
SeqStack OPTR; //运算符栈
SeqStack OPND; //操作数栈
//int s1,s2;
StackInitiate(&OPTR);
StackPush(&OPTR,'#');
StackInitiate(&OPND);
c=*exp++;
//printf("当前读取的字符为%c\n",c);
StackTop(OPTR,&tmpc);
//printf("当前运算符栈顶字符为%c\n",tmpc);
//printf("%c",tmpc);
while (c!='#'||tmpc!='#')
{
printf("进入循环,当前读取表达式的字符为%c\n",c);
if(!IsOperator(c)) //如果获取的字符不是运算符则入操作数栈
{
printf("发现操作数\n");
StackPush(&OPND,c);
c=*exp++;
//x=getchar();
}
else
{
printf("发现运算符\n");
//StackTop(OPTR,&tmpc); //获取当前运算符栈顶字符
//printf("当前的运算符是:%c\n",tmpc);
//ch=Precede(tmpc,c);
//printf("运算符是:%c\n",ch);
switch(Precede(tmpc,c))
{
case '': //退栈并计算
//printf("栈顶元素优先级高:出栈\n");
StackPop(&OPTR,&theta);
//printf("当前进行的运算是:");
//printf("%c\n",theta);
StackPop(&OPND,&b); StackPop(&OPND,&a);
StackPush(&OPND, Operate(a,theta,b));
StackTop(OPTR,&theta); //获取一个运算符出栈之后的当前运算符栈顶,继续和此时读取的运算符比较
while(Precede(theta,c)=='>')
{
StackPop(&OPND,&b); StackPop(&OPND,&a);
StackPush(&OPND, Operate(a,theta,b));
StackPop(&OPTR,&theta); //将当前的栈顶弹出(刚刚比较过的运算符)
StackTop(OPTR,&theta); //获取当前新的栈顶
}
if(Precede(theta,c)=='=') //右括号始终不进栈,在此去除左括号.
{
StackPop(&OPTR,&theta); //将当前的栈顶弹出(刚刚比较过的运算符)
//StackTop(OPTR,&theta); //获取当前新的栈顶
}
if(c!='#'&&c!=')') //将所有栈内优先级高的运算完成(出栈)之后,将当前的运算符入栈
StackPush(&OPTR,c);
//StackTop(OPND,&y);
//printf("当前操作数栈顶为%c\n",y);
//c=*exp++;
break;
}//switch
if(!StackEmpty(OPTR))
StackTop(OPTR,&tmpc);
//if(tmpc=='#') break;
//x=getchar();
if(c!='#')
c=*exp++; //c指向下一个字符
}
//printf("in while");
//printf("当前的theta:%c\n",theta);
//printf("当前的c:%c\n",c);
//printf("当前的tmpc:%c\n",tmpc);
}//while
StackTop(OPND,&y);
printf("表达式的运算结果为%c\n",y);
}
void main(void)
{
char str[M];
printf("请输入中缀表达式(注意所有运算结果都应该保证在10以内,以免出错.):\n");
gets(str);
EvaluateExpression(str);
}