表达式求值,说起来很复杂,我有源代码,你自己研究研究

#include

#include

#define MaxSize 99

void translate(char str[],char exp[])   /*将算术表达式转换成后缀表达式*/

{

struct

{

char data[MaxSize];

int top;                  /*top为栈顶*/

}op;                             /*定义一个含data和top的结构体*/

char ch;

int i = 0,t = 0;

op.top = -1;

ch = str[i];                       /*将str的每一个数转换成ch*/

i++;

while(ch != '\0')                  /*ch对应不同的符号的时候对应的转换情况*/

{

switch(ch)

{

case '(':                 /*当是(的时候,将此括号存入栈op*/

op.top++;op.data[op.top]=ch;

break;

case ')':

while(op.data[op.top] != '(')     /*括号内的转换优先级最高,故先提取表达式*/

{

exp[t]=op.data[op.top];

op.top--;

t++;

}

op.top--;

break;

case '+':

case '-':

while(op.top != -1&&op.data[op.top] != '(')

{

exp[t] = op.data[op.top];

op.top--;

t++;

}

op.top++;            /*恢复可插入位置*/

op.data[op.top] = ch;

break;

case '*':

case '/':

while(op.top == '/'||op.top == '*')       /*优先级*/

{

exp[t] = op.data[op.top];

op.top--;

t++;

}

op.top++;

op.data[op.top] = ch;

break;

case ' ':                         /*忽略空格,排除误操作*/

break;

default:

while(ch >= '0'&&ch <= '9')

{

exp[t] = ch;t++;

ch = str[i];i++;

}

i--;

exp[t] = '#';              /*分隔操作数,为了美观,也为了以后好分隔操作数,呵呵*/

t++;

}

ch = str[i];

i++;

}

while(op.top != -1)                   /*得到剩下的部分*/

{

exp[t] = op.data[op.top];

t++;

op.top--;

}

exp[t] = '\0';                         /*表达式结束*/

}

float cal_value(char exp[])

{

struct

{

float data[MaxSize];

int top;

}st;                                /*操作数栈*/

float d;

char ch;

int t = 0;

st.top = -1;

ch = exp[t];

t++;

while(ch != '\0')

{

switch(ch)                  /*运算主体*/

{

case '+':

st.data[st.top-1] = st.data[st.top-1]+st.data[st.top];

st.top--;

break;

case '-':

st.data[st.top-1] = st.data[st.top-1]-st.data[st.top];

st.top--;

break;

case '*':

st.data[st.top-1] = st.data[st.top-1]*st.data[st.top];

st.top--;

break;

case '/':

if(st.data[st.top] != 0)

st.data[st.top-1]=st.data[st.top-1]/st.data[st.top];

else

{

printf("\n\t除0是错误的");

}

st.top--;

break;

default:

d=0;

while(ch >= '0'&&ch <= '9')       /*从后缀表达式中获取操作数,#作用在此体现*/

{

d = 10*d+ch-'0';

ch = exp[t];

t++;

}

st.top++;

st.data[st.top] = d;

}

ch = exp[t];

t++;

}

return st.data[st.top];

}

int main()                                   /*可以提到前面去*/

{

char str[MaxSize],exp[MaxSize];       /*str为算术表达式,exps为后缀表达式*/

printf("请输入一个求值表达式\n");

printf("表达式:");

gets(str);                            /*输入一个算术表达式*/

printf("原表达式是:%s\n",str);

translate(str,exp);                   /*将算术表达式转换成后追表达式*/

printf("后缀表达式:%s\n",exp);

printf("计算结果:%g\n",cal_value(exp));/*通过后缀表达式来求值*/

system("pause");

return 0;

in语句作用C语言,C语言中IN(ch,OP)是什么意思相关推荐

  1. map函数作用c语言,c语言中map的用法:map基本用法

    c++中map容器提供一个键值对容器,那么你知道map的用法有哪些吗,下面秋天网 Qiutian.ZqNF.Com小编就跟你们详细介绍下c语言中map的用法,希望对你们有用. c语言中map的用法:m ...

  2. sleep函数的作用c语言,C语言中的sleep函数是什么意思【详细介绍】

    计算机知识:C语言中的Slee函数 Sleep函数简介: 函数名: sleep 功 能: 执行挂起一段时间 用 法: unsigned sleep(unsigned milliseconds); 在V ...

  3. c语言中ch的作用,C语言中IN(ch,OP)是什么意思

    表达式求值,说起来很复杂,我有源代码,你自己研究研究 #include #include #define MaxSize 99 void translate(char str[],char exp[] ...

  4. C/C++中Static的作用详述 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。

    C/C++中Static的作用详述 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条. (1)先来介绍它的第一条也是最重要的一条:隐藏. 当我们同时编译多个文件时,所有未加s ...

  5. c语言while函数作用,详解C语言中的while语句

    什么是C语言的while语句?它的作用是什么呢?估计很多初学者对此都是一知半解.下面课课家笔者就为大家详细解释C语言中的while语句的含义和作用. 首先笔者先给大家介绍C语言中的共有的三大常用的程序 ...

  6. c语言switch语句嵌套,浅谈c语言中switch语句的嵌套使用

    switch语句是一种分支控制语句,它的应用在程序设计中起到了很重要的作用.由于其格式复杂,对于初学者来说很难掌握,switch语句的嵌套使用更是让初学者难以理解.本文通过介绍switch嵌套语句的形 ...

  7. goto在c语言中的作用,为什么在C语言中,goto这么不受待见?

    原标题:为什么在C语言中,goto这么不受待见? 什么是goto语句 goto语句被称为C语言中的跳转语句.用于无条件跳转到其他标签.它将控制权转移到程序的其他部分. goto语句一般很少使用,因为它 ...

  8. c语言rand函数的作用,详解C语言中rand函数的使用

    前言 我们在编程实现算法的过程中,往往需要使用到随机数.由于计算机是一台以逻辑为基础的机器,没法做到真正的随机(大概量子计算机可以?).所以计算机生成的是伪随机数,供我们使用. 我们使用C语言的ran ...

  9. 在c语言中 n的作用是什么,c语言中(n)的意思,C语言中‘#92;n#39;是什么意思

    C语言中'\n'是什么意思 \n' 的意思是:回2113车换行.将当前位置移到下一行的5261开头. 1.\n是换行符,4102通常在输出中用作格式控制:1653\n'就是一个转义字符,其意义是&qu ...

最新文章

  1. 【Notes6】ajaxjson,校验用户名,自动提示,CORS,/swagger开发rest,Websocket,DNS
  2. Linux内存page,【原创】(十四)Linux内存管理之page fault处理
  3. linux snmpwalk版本,snmpwalk的Linux的击不返回
  4. Makefile规则介绍
  5. RabbitMQ 基本概念与高级特性
  6. 信阳农林技术学院经纬度_信阳农林学院驻村工作队为扶贫村协调种苗助力美丽乡村建设...
  7. nginx限速方法以及报错处理
  8. git 远程仓库 remote 使用总结
  9. 设计模式-第一篇之单例模式
  10. 安卓平板python编程软件下载_10 个可以在平板电脑上使用的 Python 编辑器
  11. Word制作学生点名册表格模板
  12. 使用STVP解除STM32flash读出保护
  13. 转鼓式精密过滤器滤网
  14. HCIA H12-211题库解析
  15. java导出excel文件_POI生成EXCEL文件
  16. 了解并掌握Halcon HDevelop 仿真程序语法
  17. Linux 下录屏制作 GIF 图片
  18. afrog的安装与使用
  19. 关于爬取arXiv论坛论文并按照论文主题进行分类的办法
  20. P1719 最大加权矩形(二维dp)

热门文章

  1. 产品管理(Product Management)
  2. Unicode字符列表
  3. 使用U3D给物体添加脚本时提示Can‘t add script component
  4. 读取excel文件并使用matplotlib绘图(含柱状图、柱状图加数值的显示和直方图)
  5. 什么是cookie?cookie的优缺点。
  6. spring中AspectJ
  7. 双十一必备销售看板:附完整模板素材
  8. MySQL查询优化利刃-EXPLAIN
  9. 延时100ms的流水灯
  10. libreoffice linux命令行,linux下使用libreoffice 命令行转化进行excel转PDF的排版问题