C语言 写的 表达式求值。
有不对的地方还望指出来,让我改正。谢谢。存一个代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h> #define Stack_Size 1010
#define INF 21000000
char cmp[7][8]= {">><<<>>",">><<<>>",">>>><>>",">>>><>>","<<<<<=?",">>>>?>>","<<<<<?="};
/*
> > < < < > >
> > < < < > >
> > > > < > >
> > > > < > >
< < < < < = ?
> > > > ? > >
< < < < < ? =
*/ typedef struct
{
char Elem[Stack_Size];
int top;
} Operator;
typedef struct
{
double Elem[Stack_Size];
int top;
} Number;
void InitStack_Operator(Operator* S)
{
S->top=-1;
}
void InitStack_Number(Number* S)
{
S->top=-1;
}
int Pop_Operator(Operator* S)
{
if(S->top==-1)
{
printf("运算符栈为空\n");
exit(10);
}
S->top--;
return 1;
}
int Pop_Number(Number* S)
{
if(S->top==-1)
{
printf("数字栈为空\n");
exit(11);
}
S->top--;
return 1;
}
int Push_Operator(Operator* S,char ch)
{
if(S->top==Stack_Size-1)
{
printf("运算符栈满\n");
exit(12);
}
S->top++;
S->Elem[S->top]=ch;
return 1;
}
int Push_Number(Number* S,double ch)
{
if(S->top==Stack_Size-1)
{
printf("运算符栈满\n");
exit(13);
}
S->top ++;
S->Elem[S->top]=ch;
return 1;
}
char Gettop_Operator(Operator *S)
{
if(S->top==-1)
{
printf("运算符栈为空\n");
exit(17);
}
return S->Elem[S->top];
}
double Gettop_Number(Number *S)
{
if(S->top==-1)
{
printf("数字栈为空\n");
exit(18);
}
return S->Elem[S->top];
}
double Calc(double a,double b,char opt)
{
double res;
if(opt=='+') res=a+b;
if(opt=='-') res=a-b;
if(opt=='*') res=a*b;
if(opt=='/')
{
if(fabs(b)<0.00000001)
{
printf("发生除0错误\n");
exit(15);
}
res=a/b;
}
//printf("%.2lf %c %.2lf = %.2lf\n",a,opt,b,res);
return res;
}
int change(char ch)
{
switch(ch)
{
case '+':
return 0;
case '-':
return 1;
case '*':
return 2;
case '/':
return 3;
case '(':
return 4;
case ')':
return 5;
case '#':
return 6;
}
return -INF;
}
char compare(char a,char b)
{
if(cmp[change(a)][change(b)]=='?')
{
printf("表达式错误\n");
exit(16);
}
return cmp[change(a)][change(b)];
}
int check(char *s,int len)
{
for(int i=0; i<len; i++)
{
if(s[i]>='0'&&s[i]<='9') continue;
if(s[i]=='+'||s[i]=='-'||s[i]=='*') continue;
if(s[i]=='/'||s[i]=='('||s[i]==')') continue;
return 0;
}
return 1;
} int main()
{
char a[1010],b[1010];
int len;
Operator signs;
Number number;
InitStack_Number(&number);
InitStack_Operator(&signs);
Push_Operator(&signs,'#');
double x,y;
scanf("%s",a);
len=strlen(a);
if(check(a,len)==0)
{
printf("输入中存在多余字符\n");
exit(19);
}
a[len]='#';
int i,f=0,k=0;
Push_Operator(&signs,'#');
for(i=0; i<=len; i++)
{
if((a[i]>='0'&&a[i]<='9')||a[i]=='.')
{
b[k++]=a[i];
f=1;
continue;
}
if(f)
{
b[k]='\0';
Push_Number(&number,atof(b));
f=0;
k=0;
}
switch(compare(Gettop_Operator(&signs),a[i]))
{
case '<':
Push_Operator(&signs,a[i]);
break;
case'=':
Pop_Operator(&signs);
break;
case'>':
y=Gettop_Number(&number),Pop_Number(&number);
x=Gettop_Number(&number),Pop_Number(&number);
Push_Number(&number,Calc(x,y,Gettop_Operator(&signs)));
Pop_Operator(&signs);
i--;
break;
}
}
double ans=Gettop_Number(&number);
printf("%.2lf\n",ans);
return 0;
}
C语言 写的 表达式求值。的更多相关文章
- C/C++ 语言中的表达式求值
在此,首先向裘老师致敬! 裘宗燕:C/C++ 语言中的表达式求值 经常可以在一些讨论组里看到下面的提问:“谁知道下面C语句给n赋什么值?” m = 1; n = m+++m++; 最近有位不相识的朋友 ...
- C/C++ 语言中的表达式求值(原文作者:裘宗燕)
经常可以在一些讨论组里看到下面的提问:“谁知道下面C语句给n赋什么值?”m = 1; n = m+++m++;最近有位不相识的朋友发email给我,问为什么在某个C++系统里,下面表达式打印出两个4, ...
- C语言之四则运算表达式求值(链栈)—支持浮点型数据,负数, 整型数据运算
运算符间的优先级关系: 链栈结构体定义: 数据域使用字符串长度为20的字符数组(故需要注意判断读取的字符串是运算符还是数值) 可支持浮点型数据,负数, 整型数据的运算 float EvaluateE ...
- x86汇编反编译到c语言之——(1)表达式求值及赋值语句
一. 反编译一种可能的实现方式 我们的目的是将多种平台的汇编如x86,ARM,6502反编译为c语言,所以实现时先将多种汇编转化为 特定虚拟机汇编语言,然后只需要将虚拟机汇编语言反编译为c语言.其中多 ...
- 利用栈实现算术表达式求值(Java语言描述)
利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...
- Aviator 表达式求值引擎开源框架
简介¶ Aviator是一个高性能.轻量级的java语言实现的表达式求值引擎,主要用于各种表达式的动态求值.现在已经有很多开源可用的java表达式求值引擎,为什么还需要Avaitor呢? Aviato ...
- ZT C,C++表达式求值顺序 裘老的解释。 [问题点数:300分]
http://bbs.csdn.net/topics/370153775 [置顶] [推荐] C,C++表达式求值顺序 裘老的解释. [问题点数:300分] 最近这问题有从日经变时经的趋势,这里贴出裘 ...
- 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值
一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...
- C语言中缀表达式求值(综合)
题前需要了解的:中缀.后缀表达式是什么?(不知道你们知不知道,反正我当时不知道,搜的百度) 基本思路:先把输入的中缀表达式→后缀表达式→进行计算得出结果 栈:"先进先出,先进后出" ...
随机推荐
- JavaScript世界万物诞生记
作者:manxisuo链接:https://zhuanlan.zhihu.com/p/22989691来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 一. 无中生有 起 ...
- Android view 数据缓存
Android中经常需要用到view数据的缓存,比如我们希望EditText 在被切到别的界面的时候,输入的数据要仍保持不变. 参考代码: /* 缓存textview */ public class ...
- android 获取GPS定位
AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xm ...
- IDEA Java/Scala混合项目maven打包
1.首先创建maven项目 2.创建成功后新建class,只有java的,没有scala的 3.修改pom.xml文件,引入scala <?xml version="1.0" ...
- gulp安装+一个超简单入门小demo
gulp安装參考.gulp安装參考2. 一.NPM npm是node.js的包管理工具.主要功能是管理.更新.搜索.公布node的包. Gulp是通过npm安装的. 所以首先,须要安装node.js. ...
- DLL注入新姿势:反射式DLL注入研究
在分析koadic渗透利器时,发现它有一个注入模块,其DLL注入实现方式和一般的注入方式不一样.搜索了一下发现是由HarmanySecurity的Stephen Fewer提出的ReflectiveD ...
- MBR结构解析与fdisk的bash实现
一.MBR结构解析 首先我们先介绍一些MBR的基本知识基础,再晾图片分析. MBR主要分为三大块各自是: 1.载入引导程序(446K) 2.分区表(64k) 3.标志结束位(2k) 载入引导程序:内容 ...
- Python学习笔记8:标准库之正則表達式
Python拥有强大的标准库.从如今起,開始学习标准库中提供的一些经常使用功能. 首先看正則表達式(regular expression),它的主要功能是从字符串(string)中通过特定的模式(pa ...
- HDU3572Task Schedule(最大流 ISAP比較快)建图方法不错
Task Schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- (updated on Mar 1th)Programming Mobile Applications for Android Handheld Systems by Dr. Adam Porter
本作品由Man_华创作,采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可.基于http://www.cnblogs.com/manhua/上的作品创作. Lab - Inte ...