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语言中缀表达式求值(综合)
题前需要了解的:中缀.后缀表达式是什么?(不知道你们知不知道,反正我当时不知道,搜的百度) 基本思路:先把输入的中缀表达式→后缀表达式→进行计算得出结果 栈:"先进先出,先进后出" ...
随机推荐
- js获得checkbox选中值及input后面的文本
原文:http://blog.csdn.net/u014079773/article/details/51865596 js如何获得多个checkbox选中的值及input后面所跟的文本 <!d ...
- windows10 安装 mysql 5.6 教程
首先是下载 mysql-installer-community-5.6.14.0.msi ,大家可以到 mysql 官方网去下载. win10的安全机制比较严格,安装前最好到<设置>--& ...
- 转:WebRTC技术及应用2 – NAT穿越技术的使用
评:webrtc自带的打洞,穿透协议. 转: http://www.unclekevin.org/?p=924 959 views WebRTC技术及应用2 – NAT穿越技术的使用 发表回复 (题图 ...
- 自己定义ImageView,实现点击之后算出点击的是身体的哪个部位
近期也是由于项目的原因,所以有机会接触到这边的算法. 此文重点不是怎样实现的思路和原理, 有须要的同事能够借鉴一下 废话不多说,直接上代码: <span style="font-siz ...
- 文本聚类——Kmeans
上两篇文章分别用朴素贝叶斯算法和KNN算法对newgroup文本进行了分类測试.本文使用Kmeans算法对文本进行聚类. 1.文本预处理 文本预处理在前面两本文章中已经介绍,此处(略). 2.文本向量 ...
- ThinkPHP5.0中Request请求对象的常用操作
获取当前系统参数 // 获取当前域名 echo '获取当前域名:'.$request->domain() . '<br/>'; // 获取当前入口文件 echo '获取当前入口文件: ...
- ES7前端异步玩法:async/await理解 js原生API妙用(一)
ES7前端异步玩法:async/await理解 在最新的ES7(ES2017)中提出的前端异步特性:async.await. 什么是async.await? async顾名思义是“异步”的意思,a ...
- android中的MD5、Base64、DES/3DES/ADES加解密
MD5摘要算法: <span style="font-size:18px;">主要代码: String s = edit.getText().toString(); i ...
- YUV格式
http://blog.csdn.net/u011270282/article/details/50696616 http://blog.csdn.net/acs713/article/details ...
- class中的私有属性的访问
在类中的私有属性设置: class Name(): __init__(self): self.__name = 'arnol'` 如何查看: 1,在类中定义一个方法: def getname(self ...