运算符间的优先级关系:

链栈结构体定义:

数据域使用字符串长度为20的字符数组(故需要注意判断读取的字符串是运算符还是数值)

可支持浮点型数据,负数, 整型数据的运算

float EvaluateExpression() 函数实现步骤:

1)初始化OPTR栈和OPND栈,将表达式起始符 “#” 压入OPTR栈。

2)扫描表达式,读入第一个字符串str,如果表达式没有扫描完毕至 "#" 或压入OPTR的栈顶元素不为 "#" 时,则循环执行以下操作:

——>使用  str_to_float()函数判断输入的字符串str是否是运算符

——>如果str不是运算符,则压入OPND栈,读取下一个字符串str

——>如果字符串str是运算符,使用 Precede() 函数获取OPTR栈顶元素的运算符和字符串str的运算符的优先级:

——>若是 ‘

——>若是 ‘>’ ,则弹出OPTR栈顶的运算符字符串,从OPND栈弹出两个数值字符串,使用 Operate() 函数对两个字符串进行运算,将得到的浮点型运算结果使用  float_to_str()函数转换成字符串型数据,压入OPND栈

——>若是 ‘=’ ,则OPTR的栈顶元素是 "(" 且 str 是 ")" ,这时弹出OPTR栈顶的 "(" ,相当于括号匹配成功,然后读入下一字符串str

3)OPND栈顶元素记为表达式求值结果,输出运算结果。

实现代码(.cpp后缀文件)

#include

#include

#include

#include

#define inf float(0x3f3f3f3f)

#define MAXSIZE 100

char priority[] = {'+', '-', '*', '/', '(', ')', '#'};

char priority_relationship[][] = {

{'>', '>', '', '>'},

{'>', '>', '', '>'},

{'>', '>', '>', '>', '', '>'},

{'>', '>', '>', '>', '', '>'},

{'

{'>', '>', '>', '>', ' ', '>', '>'},

{'

}; // 各个运算符之间的优先级关系

int get_index(char str[])

{// 获取相应运算符的索引

for(int i = ; i < ; i++)

{

if(str[] == priority[i]) return i;

}

printf("未找到匹配的字符\n");

}

char Precede(char inside_data[], char input_data[])

{// 获取两个运算符之间的优先级关系

int inside_index = get_index(inside_data);

int input_index = get_index(input_data);

return priority_relationship[inside_index][input_index];

}

typedef struct StackNode

{

char data[MAXSIZE]; // 压入栈里面的数据都是字符型,在进行运行时,记得将字符型数字转换为浮点型数字

struct StackNode *next;

}StackNode, *LinkStack;

void InitStack(LinkStack &S)

{// 构造一个空栈S,栈顶指针置空

S = NULL;

}

void Push(LinkStack &S, char data[])

{// 在栈顶插入元素data

StackNode *p;

p = (StackNode *)malloc(sizeof(StackNode)); // 生成新的结点

strcpy(p->data, data); // 将新结点的数据域置为data

p->next = S; // 将新结点插入栈顶

S = p; // 修改栈顶指针为p

}

char *Pop(LinkStack &S)

{// 删除S的栈顶元素, 用data返回其值

char data[MAXSIZE];

if(S == NULL) printf("错误!!!\n栈为空, 无法执行删除命令...");

else

{

StackNode *p;

strcpy(data, S->data); // 将栈顶元素赋给data

p = S; // 用p临时保存栈顶元素的空间,以备释放

S = S->next; //修改栈顶指针

free(p); // 释放原栈顶元素的空间

return data;

}

}

char *GetTop(LinkStack &S)

{// 获取栈顶元素

if(S != NULL)

return S->data;

else

{

printf("错误!!!\n栈顶为空");

return "";

}

}

float str_to_float(char *str)

{// 将字符串数据转换成浮点型数据

float num = ;

int state_1 = ; // 用于判断是否读取到小数点的状态值, 0代表还没有读取到

int state_2 = ; //用于判断是否读取到负号的状态值, 0代表还没有读取到

while(( *str != '\0' && *str >= '' && *str <= '') || *str == '.' || (*str == '-' && *(str + ) != '\0'))

{// 注意判断小数点和负号

if(*str == '.') state_1 = ; // 当读取到小数点的时候, 状态值state_1赋值为1

else if(*str == '-') state_2 = ; // 当读取到负号的时候, 状态值state_2赋值为1

else

{

if(state_1 == ) num = num * + (*str - '');

else

{

num += (*str - '') * pow(0.1, state_1);

state_1++;

}

}

str++;

}

if(*str != '\0') return inf;

else if(state_2 == )

{

return num * -;

}

else return num;

}

char *float_to_str(float num)

{// 将浮点型数据装换成字符串数据,保留浮点型数据小数点后4位的值

char str[MAXSIZE];

sprintf(str, "%.4f", num); // 保留小数点后4位

return str;

}

float Operate(char a[], char theta[], char b[])

{//执行运算

float a_num = str_to_float(a);

float b_num = str_to_float(b);

if(theta[] == '+') return a_num + b_num;

else if(theta[] == '-') return a_num - b_num;

else if(theta[] == '*') return a_num * b_num;

else if(theta[] == '/') return a_num / b_num;

else printf("错误!!!\n无该运算符");

}

void EvaluateExpression()

{

StackNode *OPND, *OPTR;

char str[MAXSIZE];

char theta[MAXSIZE];

char a[MAXSIZE];

char b[MAXSIZE];

InitStack(OPND); // 初始化栈 OPND

InitStack(OPTR); // 初始化栈 OPTR

Push(OPTR, "#"); // 将 "#" 压入栈OPTR

printf("请输入算术表达式(支持负数,浮点型数据),每个值用空格隔开输入,并以#结束\n");

scanf("%s", str);

while(str[] != '#' || GetTop(OPTR)[] != '#')

{

if(str_to_float(str) != inf)

{ // 如果str不是运算符,则压入OPND栈,读取下一个字符串str

Push(OPND, str); // 将字符串str压入OPTR栈

scanf("%s", str); // 读入下一个字符串str

}

else

{ // 如果字符串str是运算符,使用 Precede() 函数获取OPTR栈顶元素的运算符和字符串str的运算符的优先级

switch (Precede(GetTop(OPTR), str)) // 使用 Precede() 函数获取相应优先级

{

case '

Push(OPTR, str); // 将字符串str压入OPTR栈

scanf("%s", str); // 读入下一个字符串str

break;

case '>':

strcpy(theta, Pop(OPTR)); // 弹出OPTR栈顶的运算符字符串并赋值给变量 theta

strcpy(b, Pop(OPND)); // 弹出OPND栈顶的数值字符串并赋值给变量 b

strcpy(a, Pop(OPND)); // 弹出OPND栈顶的数值字符串并赋值给变量 a

char temp_str[MAXSIZE];

strcpy(temp_str, float_to_str(Operate(a, theta, b))); // 根据相应的三个字符串进行运算,把结果赋给temp_str

Push(OPND, temp_str); // 将运算结果 temp_str 压入OPND栈

break;

case '=':

Pop(OPTR); // 弹出OPTR栈顶的运算符字符串

scanf("%s", str); // 读入下一个字符串str

break;

default:

printf("错误!!!\n该优先级不存在!!!");

}

}

}

printf("%s\n", GetTop(OPND));

}

int main(void)

{

EvaluateExpression();

system("pause");

return ;

}

运行结果:

数据结构课程设计四则运算表达式求值(C语言版)

本系统为四则运算表达式求值系统,用于带小括号的一定范围内正负数的四则运算标准(中缀)表达式的求值.注意事项:    1.请保证输入的四则表达式的合法性.输入的中缀表达式中只能含有英文符号"+ ...

C&sol;C&plus;&plus; 语言中的表达式求值

在此,首先向裘老师致敬! 裘宗燕:C/C++ 语言中的表达式求值 经常可以在一些讨论组里看到下面的提问:“谁知道下面C语句给n赋什么值?” m = 1; n = m+++m++; 最近有位不相识的朋友 ...

C&sol;C&plus;&plus; 语言中的表达式求值&lpar;原文作者:裘宗燕&rpar;

经常可以在一些讨论组里看到下面的提问:“谁知道下面C语句给n赋什么值?”m = 1; n = m+++m++;最近有位不相识的朋友发email给我,问为什么在某个C++系统里,下面表达式打印出两个4, ...

表达式求值(栈方法&sol;C&plus;&plus;语言描述)(二)

上篇中完成了对表达式求值的整体过程,接下来看看如何处理不同类型的token. 对运算数的处理比较简单,它直接调用函数strtod(),将字符串中的运算数转换为浮点类型并将它压入运算数栈中: void ...

【NYOJ-35】表达式求值——简单栈练习

表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...

Matrix Chain Multiplication&lpar;表达式求值用栈操作)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1082 Matrix Chain Multiplication Time Limit: 2000/100 ...

河南省acm第九届省赛--《表达式求值》--栈和后缀表达式的变形--手速题

表达式求值 时间限制:1000 ms | 内存限制:65535 KB 难度:3   描述 假设表达式定义为:1. 一个十进制的正整数 X 是一个表达式.2. 如果 X 和 Y 是 表达式,则 X+Y, ...

表达式求值(栈方法&sol;C&plus;&plus;语言描述)(一)

一个算数表达式(以下简称为表达式)由运算数.运算符.左括号和右括号组成,定义一个枚举类型TokenType表示为: typedef enum { BEGIN, NUMBER, OPERATOR, LE ...

C语言 写的 表达式求值。

有不对的地方还望指出来,让我改正.谢谢.存一个代码 #include #include #include ...

随机推荐

安利eclipse插件之log4E

敲完代码之后,据说要加注释.加log:OTL~~~~~~~~,在我仰天长叹之际,师父发给我了一个插件压缩包,解压-->拷贝-->重启-->了事.安装方法已经如此之便捷,简直是我辈懒癌 ...

bootstrap-collapse

colapse插件:折叠功能 插件:collapse.js 实现方法:以data-toggle做被点击者,以div class="collapse in"显示展开内容

&lbrack;转&rsqb;响应式网页设计&colon;rem、em设置网页字体大小自适应

本文转自:http://www.cnblogs.com/aimyfly/archive/2013/07/19/3200742.html 「rem」是指根元素(root element,html)的字体 ...

stdlib

system(pause): int cmp(const void *a ,const void *b) { return *(int *)a - *(int *)b ;          //从小到 ...

js数组的管理&lbrack;增&comma;删&comma;改&comma;查&rsqb;

今天在设计表单的时候遇到对数组的一些处理的问题,比如说怎么创建一个数组,然后牵扯到数组的增删改查的方法.请看API FF: Firefox, N: Netscape, IE: Internet Exp ...

blend

看着各位大虾出系列文章貌似挺好玩的,本人耍了2个月的Wpf,有点见解,希望各位看官笑纳.本系列第一章就先来点简单又有用的吧o(∩_∩)o 哈哈.. 终于效果例如以下: ←点它 本人一直在做WPF算是第 ...

Django查询笔记1

models.Book.objects.filter(**kwargs): querySet [obj1,obj2] models.Book.objects.filter(**kwargs).valu ...

编程语言 Node&period;js中使用到的npm工具

啥是npm? npm就是(node package manager)包结点管理器,它随同Node.js一起安装的,由于新版的nodejs已经集成了npm,所以之前npm也一并安装好了. 同样可以通过输 ...

JAVA基础复习与总结&lt&semi;八&gt&semi; 缓冲流&lowbar;数据流&lowbar;对象流&lowbar;IO总结

缓冲流.数据流以及对象流 一.缓冲流 缓冲流的概念:在读写的时候,对于单字节的读取会造成硬盘的频繁读写,增加访问次数,降低了读取文件的效率.而引入缓冲流之后,就可以将多个字节写入缓冲区,在缓冲区积累之 ...

Kali学习笔记34:配置TFTP和FTP服务

配置TFTP: 默认情况下windowsXP和2003是开启TFTP服务的 其他windows到控制面板设置好就行 kali系统也是安装了TFTP服务的:atftpd 下面是一些配置并放入一个文件 w ...

c语言求不定式的最大值,C语言之四则运算表达式求值(链栈)—支持浮点型数据,负数, 整型数据运算...相关推荐

  1. C语言编程>第六周 ① 编写一个录入函数:用来从键盘接收n个整型数并存放在一个整型数组中。 在主函数中调用该函数计算出这n个整数之和。

    例题:编写一个录入函数:用来从键盘接收n个整型数并存放在一个整型数组中. 在主函数中调用该函数计算出这n个整数之和. 代码如下: /*代码分析:录入函数需要两个参数:一个参数是需要用来存储数字的数组, ...

  2. 求二元函数最大值matlab,利用matlab, 二元函数求最大值

    求二元函数 z=0.2323*x^2-0.2866^2+2*(-0.5406)*a0^2+1.0203*a0^2*x^2/((x^2+y^2)^0.5*tanh(2*(x^2+y^2)^0.5)-x^ ...

  3. c语言编程实现二进制计算器,本程序是用纯C语言编的一个基于命令行的四则运算计算器。主要用于计算四则运算表达式的值,同时可以实现四...

    本程序是用纯C语言编的一个基于命令行的四则运算计算器.主要用于计算四则运算表达式的值,同时可以实现四 2016-08-22 0 0 0 暂无评分 其他 1 积分下载 如何获取积分? 本程序是用纯C语言 ...

  4. Bailian4132 四则运算表达式求值【文本处理】

    4132:四则运算表达式求值 总时间限制: 1000ms 内存限制: 65536kB 描述 求一个可以带括号的小学算术四则运算表达式的值 输入 一行,一个四则运算表达式.''表示乘法,'/'表示除法 ...

  5. 四则运算表达式求值の各种心碎

    实验三---四则运算表达式求值 一.基本要求: ( 1 ) 利用二叉树后序遍历来实现表达式的转换,同时可以使用实验三的结果来求解后缀表达式的值. ( 2) 输入输出格式: 输入格式:在字符界面上输入一 ...

  6. 分别用C++和JavaScript 实现四则运算表达式求值

    博主16年4.19去面腾讯实习生,其中一个问题是让写一个函数求四则运算表达式的值,输入是字符串,输出为表达式结果.当时只记得这是数据结构里堆栈的应用,表达式要变顺序,但是实现就想不起来了,自然程序写的 ...

  7. 栈的应用(递归:例子裴波那契数列 四则运算表达式求值 :后缀(逆波兰) )

    递归: -栈有一个很重要的应用:在程序设计语言中实现递归. 当你往镜子前面一站,镜子里面就有-一个你的像. 但你试过两面镜子一起照吗?如果A.B两面镜子相互面对面放着,你往中间- -站,嘿,两面镜子里 ...

  8. 栈运算 java_栈的应用——四则运算表达式求值(Java实现)

    首先介绍几个概念 中缀式:平常我们所用到的标准的四则运算表达式就是中缀式,如9+(3-1)*3+10/2,这就是一个中缀式 后缀式(逆波兰式):一种不需要括号的后缀表达法,我们也把他称为逆波兰式,如将 ...

  9. c语言的字符数据与整型数据可以互相赋值,2012年计算机二级C语言字符型数据考点归纳...

    第6章 字符型数据考点归纳 6.1 字符常量 有两种形式:一是用单引号括起来的一个单字符,如′a′,′?′,′=′:二是″转义字符″,即以″\″开头的字符序列.常用的转义字符见下表. 字符形式 功 能 ...

最新文章

  1. 动态加载用户控件的怪问题
  2. leetcode算法题-- 最长递增子序列的个数★
  3. HelloFresh迁移至新的API网关,实现微服务架构
  4. io类游戏快速开发 2
  5. python写空气质量提醒_你所在的城市空气质量如何?用Python可视化分析空气质量...
  6. ip为 : 202.76.52.142/30 怎么看?
  7. 使用图形窗口连接(navicat)
  8. MediaPlayer播放音频,也可以播放视频
  9. python3爬取数据存入mysql_pyspider 数据存入Mysql--Python3
  10. DotNetBar 教程
  11. Android性能优化系列——Performance Tips
  12. GRE(Generic Routing Encapsulation,通用路由封装)tunnel技术
  13. c# 配置系统未能初始化
  14. 修改网页logo图片
  15. 网站中qq 跳转 和qq群问题
  16. Greenplum小把戏 - ip地址表达方式转换函数
  17. 三酷猫学python_python学习06循环
  18. 106短信群发如何在移动信息时代下实现精准营销
  19. 诡异的心理暗示?胡扯
  20. SOLOV2源码解析

热门文章

  1. 2008年上半年系统分析师上午英语试题分析与参考答案
  2. 最高效寻找重复数据,如何高效率的查找到数组中的重复值
  3. android-处理日期时间 - 随心
  4. (灵感)集设网关于设计灵感的网站
  5. 技术分享 | 无人机集群——分布式控制算法
  6. k8s源码分析--kube-scheduler源码(一)
  7. 从恶意程序对LNK格式的利用方法看防护趋势
  8. Python + Selenium实现web端的UI自动化
  9. ubuntu下查看电脑硬件的基本信息
  10. 【天光学术】物流工程论文:连锁超市缺货和爆仓库存问题改善分析(节选)