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

#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;

◆◆

评论读取中....

请登录后再发表评论!

◆◆

修改失败,请稍后尝试

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

  1. c语言中 amp 的作用,c语言中“amp;amp;”什么意思

    c语言中"&&"什么意思 在c语言中,"&&"是"与"."并且"的意思.它是逻辑运算符, ...

  2. C语言中fscanf的作用,C语言中fgets和fscanf区别详解

    搜索热词 C语言中fgets和fscanf区别详解 一.作用上的大概区别: ①fgets:从文件中读取一行数据存入缓冲区(fgets遇到回车才会结束,不对空格和回车做任何转换就录入到缓冲区,结束后再往 ...

  3. c语言中argc的作用,C语言中main函数的参数argc和argv

    参考资料: C++语言中的main函数,经常带有参数argc,argv,如下: int main(int argc, char** argv) int main(int argc, char* arg ...

  4. c语言中endif的作用,C语言中#ifdef,#ifndef和#endif的作用

    现在规定一下头文件书写规范, 根据陈皓编写的跟我一起些makefile,一定要记住:头文件中应该只是声明,而定义应该放在C/C++文件中.否则如果出现有定义,比如头文件中有int a =2;如果有多个 ...

  5. c语言中fopen的作用,c语言中fopen的用法

    在C语言中,fopen也是一个打开文件的函数.在C语言的命令窗口中输入doc fopen或者help fopen就可以获得该函数的帮助信息.下面小编就跟你们详细介绍下c语言中fopen的用法,希望对你 ...

  6. c语言中rand()的作用,c语言中的rand()函数用法

    rand() rand()函数作用:用来产生随机数,但是,rand()的内部实现是用线性同余法实现的,是伪随机数,由于周期较长,因此在一定范围内可以看成是随机的. rand()函数返回:返回一个范围在 ...

  7. c语言中exit函数作用,c语言中exit函数 c语言中exit与break区别

    C语言中exit();怎么用? exit() 结束当前进程/当前程序/,在整个程序中,只要调用 exit ,就结束. return() 是当前函数返回,当然如果是在主函数main, 自然也就结束当前进 ...

  8. 在c语言中 auto的作用,c语言中auto是什么意思

    说起auto相信很多人都不知道是什么意思,下面php中文网就带领大家学习一下c语言中auto是什么意思. auto是C语言的一个关键字,关键字主要用于声明变量的生存期为自动,即将不在任何类.结构.枚举 ...

  9. c语言中funx的作用,c语言中fun用法详解

    C语言中fun用法详解 fun函数是自定义的C/C++语言函数,函数功能多样.该函数名为"函数"英文function的简写,一般在示例和试题中使用,通常在主函数中被调用. C/C+ ...

最新文章

  1. 力扣算法题—073矩阵置零
  2. [转载]Word直接发布新浪博客(以Word 2013为例)
  3. FTP同步的另类解决办法——NetDrive
  4. MATLAB图像取点操作
  5. 微信小程序_wxml学习
  6. python创建函数、可以接受任意多个整数参数并求和_pythonxlwt:求和函数最大参数限制?...
  7. 小米空调来了,意外的是还一起来了一个马桶盖
  8. 2015.5.21 Core Java Volume 1
  9. Linux Kettle 闪退问题解决方案
  10. 建立一个成功的OpenStack组
  11. qt执行linux sudo命令语句,linux命令_sudo
  12. PHP自动加载下——PSR4
  13. c++ Static理解
  14. 线性代数中一组基向量的标准正交化原理通熟易懂理解
  15. GD32库中常用的位操作REGIDX_BIT(regidx, bitpos)
  16. Android OTA releasekey 替换
  17. 动漫主题的聊天室(html+css+js)(聊天室下篇)
  18. 苹果手机Java在那_iPhone8描述文件在哪?iPhone描述文件不见了如何解决?
  19. AFPM100/B消防电源在南京基地模检具业务搬迁改造项目的应用
  20. compareTo的用法

热门文章

  1. 多媒体集中控制系统 (4600版)
  2. IT企业内部系统运营推广的六种方法
  3. 将特殊字体添加到了html页面中
  4. java的几种基本数据类型及其大小
  5. 【转】外连接&全连接的区别
  6. 新编程语言——微软的“M”语言
  7. 嵌入式系统常用词汇统计表
  8. 使用A*算法求最短路径
  9. DPark安装及相关资料整理
  10. 什么是面向对象编程(Java)