表达式运算器的实现原理(快速优先法)

原创 2001年06月27日 20:29:00
int scan(char *src,float *num,char *sign,int *level)
{
int count=0,stdlevel=0;
while(*src)
{
if(*src=='(')stdlevel+=2;
if(*src==')')stdlevel-=2;
if(*src=='+' || *src=='-'){sign[count]=*src;level[count]=stdlevel;}
if(*src=='*' || *src=='/'){sign[count]=*src;level[count]=stdlevel+1;}
if(*src>='0' && *src<='9')
{
num[count]=0;
while(*src>='0' && *src<='9')
{
num[count]=num[count]*10+*src-'0';src++;
}
count++;src--;
}
src++;
}
return count;
}
float exp(int index,float *num,char *sign,int *level)
{
int k;
float mid,left,right;
if(index<2)mid=num[0];
else if(index<3){left=num[0];right=num[1];k=1;}
else
{
int min=25536,d;
k=index-1;
for(d=index-1;d>0;d--)if(min>level[d]){min=level[d];k=d;}
if(k>=2)left=exp(k,num,sign,level);
else left=num[k-1];
if(index-k>=2)right=exp(index-k,num+k,sign+k,level+k);
else right=num[index-1];
}
switch(sign[k])
{
case '+':mid=left+right;break;
case '-':mid=left-right;break;
case '*':mid=left*right;break;
case '/':mid=left/right;break;
}
return mid;
}

main()
{
char sign[100],*src="1+2*(2*(5-2)-4)/2";/*"(1+2)*3-(4-5*(6/(7+8)-9))*10-11/12";*/
int count=0,k,level[100];
float num[100],last;
count=scan(src,num,sign,level);
last=exp(count,num,sign,level);
clrscr();
printf("/nlast=%6.2f",last);
for(k=0;k<count;k++)
{
gotoxy(k*5+1,4);
printf("%3.0f",num[k]);
if(k>=count-1)continue;
gotoxy(k*5+5,5);
printf("%1c",sign[k+1]);
gotoxy(k*5+4,6);
printf("%2d",level[k+1]);
}
getch();
}

简单表达式求值——算符优先法

前言 周五加班的时候,在九度oj上练习了一道简单表达式求值的题目,用到了“算符优先法”,这里简单的记录一下 题目 题目描述: 读入一个只包含 +, -, *, / 的非负整数计算...
  • zinss26914
  • zinss26914
  • 2012年11月18日 16:49
  • 2569

栈的运用(算数表达式求值的算符优先算法 十以内简单版)

假定运算符有加(+),减(-),乘(*),除(/)),操作数限制为一位数,圆括号看作分界符。中缀表达式 a*b+c a+b*c a+(b*c+d)/e ...
  • wilver
  • wilver
  • 2016年03月28日 20:57
  • 1544

数据结构-算术表达式-算符优先法

代码还添加了乘方的优先级,自行参考 一开始我写的只能输入个位数,后来想了好久才解决,主要是在判断是否为运算符后,若不是运算符,别急着入栈,用一个标记数组记着,若下一个字符还不是运算符,则利用strc...
  • L954688947
  • L954688947
  • 2015年10月23日 11:45
  • 1393

栈的应用 之 用算符优先法求表达式的值

输入为表达式,以‘#’结尾 例如:2+3*(33-23) +5/4# #include #include #include #include #include   #include us...
  • ESESZB
  • ESESZB
  • 2016年10月25日 21:19
  • 312

实验2 运算器的编程实现

实验2 运算器的编程实现 一、实验目的 1、加深对计算机中运算器的基本概念、运算方法和基本原理的理解。 2、提高学生对计算机编程语言掌握的熟练程度。 二、实验内容 运用一种编程语言实现计算器的基本功能...
  • EDDJH_31
  • EDDJH_31
  • 2017年03月03日 09:49
  • 716

计算机组成原理运算器的编程实现

一、实验目的 1、加深对计算机中运算器的基本概念、运算方法和基本原理的理解。 2、提高学生对计算机编程语言掌握的熟练程度。二、实验内容 运用一种编程语言实现计算器的基本功能。 思考: 1、计...
  • qq_35260622
  • qq_35260622
  • 2016年06月12日 20:21
  • 2717

编译原理实验四——算符优先文法语法分析

[实验任务]  1、实现算符优先分析算法。2、完成以下描述算术表达式的算符优先文法的算符优先分析过程。G[E]:E→E+T∣E-T∣T            T→T*F∣T/F∣F         F...
  • ffee
  • ffee
  • 2006年06月02日 17:17
  • 10521

java实现表达式求值(算符优先算法,可计算int,double,float 形数据)

1.首先要实现一个运算符关系表(根据运算符的优先权生成) import java.util.ArrayList; public class RuleTable { //此表可添加 //操作...
  • sgilec
  • sgilec
  • 2015年04月21日 13:16
  • 944

栈---算符优先算法

【例3-3】表达式求值。表达式求值是程序设计语言编译中的一个基本问题,它的实现是栈应用的一个典型例子。这里介绍“算符优先算法”,这种算法简单直观且使用广泛。 “算符优先算法”是用运算符的优先级来确定表...
  • zhibudefeng
  • zhibudefeng
  • 2011年11月04日 22:36
  • 4429

7.栈的应用-四则运算算术表达式求解(算符优先法)

1.理论 表达式求解在程序编译器sheji
  • wenzhou1219
  • wenzhou1219
  • 2014年04月17日 22:29
  • 7206
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:表达式运算器的实现原理(快速优先法)
举报原因:
原因补充:

(最多只允许输入30个字)