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语言中缀表达式求值(综合)
题前需要了解的:中缀.后缀表达式是什么?(不知道你们知不知道,反正我当时不知道,搜的百度) 基本思路:先把输入的中缀表达式→后缀表达式→进行计算得出结果 栈:"先进先出,先进后出" ...
随机推荐
- 邁向IT專家成功之路的三十則鐵律 鐵律十一:IT人應對之道-靈活
身為一位優秀的IT專家,不能夠只是在技術面的應對能力強,而必須是在人事的應對能力上也要能夠靈活與彈性,否則就算一天給你48小時,你也會把自己的身心弄垮,再強的專業.技術.能力也會瞬間化為泡影. 坦白說 ...
- 【mac IntelliJ Idea】mac上 idea快速重写父类方法 快捷键
windows上快捷键: Ctrl+O Mac上快捷键: command+O 在要重写父类方法的位置 ,按下快捷键,然后选择要重写的方法即可.
- 用ELK 实时处理搜索日志
转载请标明原处:http://blog.csdn.net/hu948162999/article/details/50563110 本来这块业务 是放到SolrCloud上去的 , 然后 採用solr ...
- kubernetes调度之资源耗尽处理配置
系列目录 本篇将介绍如何使用kubelet处理资源耗尽的情况 当可用的计算机资源非常低的时候,kubelet仍然要保证节点的稳定性.当处理不可压缩的计算机资源(比如内存或磁盘空间)时,这尤其重要,当这 ...
- Python之Pandas库常用函数大全(含注释)
前言:本博文摘抄自中国慕课大学上的课程<Python数据分析与展示>,推荐刚入门的同学去学习,这是非常好的入门视频. 继续一个新的库,Pandas库.Pandas库围绕Series类型和D ...
- activity fragment 转场动画
http://www.cnblogs.com/avenwu/p/3372736.html v4 fragment fragmentTransaction.setCustomAnimations(R.a ...
- MVC5中使用jQuery Post 二维数组和一维数组到Action
很久没有写了,最近在做一个MVC项目,这是我做的第一个MVC项目.之前可以说多MVC一点都不了解,今天把昨天遇到的一个问题记录下来.MVC大神就请飘过吧,跟我遇到同样问题的可以进来看看.遇到的第一个问 ...
- 在VS2015中增加JQuery引用及智能提示
打开VS2015,从"工具"菜单选择NuGet选项,搜索Jquery,并点击安装. 可以看到解决方案的scripts增加了对应文件的引用 在HTML文件中可以直接引用j ...
- php 批量删除数据
php 批量删除数据 :比如我们在看邮箱文件的时候,积攒了一段时间以后,看到有些文件没有用了 这时候我们就会想到把这些 没用的文件删除,这时候就用到了批量删除数据的功能,这里我是用了数据库原有的一个表 ...
- JQery 动态填充数据到table 中
说明: 1.把数据库中的数据查询出来,填充到前台的table中,注意 从数据查询出来的 属性IsNew="0"(table 行tr的属性) 2.单击“添加”按钮 新添加行追加到ta ...