[Algorithm]一切始于ADT-表达式计算
Sedgewick的《算法》和Allen Weiss的《算法和数据结构》,这两本比较优秀的算法入门教材第一课都是ADT(abstract data type).无疑,ADT非常有用且非常有趣的知识。刚好最近学校的C语言课程给了一道这样的题目..
1.问题描述
从标准输入中读入一个整数算术运算表达式,如5 - 1 * 2 * 3 + 12 / 2 / 2 = 。计算表达式结果,并输出。
要求:
1、表达式运算符只有+、-、*、/,表达式末尾的’=’字符表示表达式输入结束,表达式中可能会出现空格;
2、表达式中不含圆括号,不会出现错误的表达式;
3、出现除号/时,以整数相除进行运算,结果仍为整数,例如:5/3结果应为1。
暴力解也不是不可以,但如果使用栈的话,这道题就会变得简单一些..
2.思路
利用栈将中缀式转换成后缀表达式,然后再次利用栈对后缀式进行计算
3.实现
#include <stdio.h>#include <string.h>#include <ctype.h>#include <stdlib.h>int length;struct ele{char op;int num;int end_flag;};int postfixtoresult(struct ele *t);void infix2postfix(struct ele *t);int ele_strlen(struct ele *t);void getrank(int *rank,char op);struct ele pop(struct ele *stack,struct ele **head);void push(struct ele **head,struct ele x);int isempty(struct ele *stack,struct ele **head);void to_ele_string(char *t,struct ele *ele_t);int main(){char s_buf[100];char clean_date[100];struct ele ele_buf[100];int l,i,k=0;for(i=0;i<100;i++)ele_buf[i].op=ele_buf[i].end_flag=ele_buf[i].num=0;fgets(s_buf,100,stdin);l=strlen(s_buf);for(i=0;i<l;i++)if(s_buf[i]==' '||s_buf[i]=='='||s_buf[i]=='\n')continue;else clean_date[k++]=s_buf[i]; clean_date[k]='\0';to_ele_string(clean_date,ele_buf);infix2postfix(ele_buf);l=postfixtoresult(ele_buf);printf("%d",l);return 0;} void to_ele_string(char *t,struct ele *ele_t){char TEMP[10];int k=0,m=0,i=0;int l=strlen(t);for(i=0;i<l;i++){if(isdigit(t[i]))TEMP[k++]=t[i];else{TEMP[k]='\0';ele_t[m].op = 0;ele_t[m].num = atoi(TEMP);ele_t[m].end_flag = 0;m++;ele_t[m].op = t[i];ele_t[m].num = 0;ele_t[m].end_flag = 0;m++;k=0;memset(TEMP,0,sizeof(TEMP));}}TEMP[k]='\0';ele_t[m].op = 0;ele_t[m].num = atoi(TEMP);ele_t[m].end_flag = 1;}int postfixtoresult(struct ele *t){struct ele stack[100];struct ele *head=stack;struct ele TEMP;int l=ele_strlen(t);int i;for(i=0;i<l;i++){if(t[i].op==0)push(&head,t[i]);else{int a,b,r=0;a=pop(stack,&head).num;b=pop(stack,&head).num;switch(t[i].op){case '+':r=a+b;break;case '-':r=b-a;break;case '*':r=a*b;break;case '/':r=b/a;break;}TEMP.op=0;TEMP.num=r;TEMP.end_flag=0;push(&head,TEMP);}}return pop(stack,&head).num;}void infix2postfix(struct ele *t){struct ele stack[100];struct ele *head=stack;struct ele out_buf[100];int k=0;int i;for(i=0;i<100;i++){out_buf[i].op=0;out_buf[i].end_flag=0;out_buf[i].num=0;}int length=ele_strlen(t);int head_rank=0,p_rank=0;for(i=0;i<length;i++){if(t[i].op==0)out_buf[k++].num=t[i].num;else{if(isempty(stack,&head)){push(&head,t[i]);}else{getrank(&p_rank,t[i].op);getrank(&head_rank,(*(head-1)).op);while(head_rank>=p_rank){out_buf[k++]=pop(stack,&head);if(isempty(stack,&head))break;getrank(&head_rank,(*(head-1)).op);}push(&head,t[i]);}}}while(!isempty(stack,&head))out_buf[k++]=pop(stack,&head);out_buf[k-1].end_flag=1;memcpy(t,out_buf,100*sizeof(struct ele));}int ele_strlen(struct ele *t){int i=1;while(!t++->end_flag)i++;return i;}void getrank(int *rank,char op){switch(op){case '*':*rank=2;break;case '/':*rank=2;break;case '+':*rank=1;break;case '-':*rank=1;break;}}int isempty(struct ele *stack,struct ele **head){if(*head==stack)return 1;else return 0;return 1;}void push(struct ele **head,struct ele x){**head=x;*head=*head+1;}struct ele pop(struct ele *stack,struct ele **head){struct ele null;null.end_flag=1;if(isempty(stack,head))return null;else{*head=*head-1;return **head;}return null;}
转载于:https://www.cnblogs.com/cn-lhc/p/6080387.html
[Algorithm]一切始于ADT-表达式计算相关推荐
- [算法 笔记]字符串表达式计算(简易版)
题目:编写一个函数,计算字符串中表达式的值,参数中只包含计算符:+,-,*,/等.例如,str="10+50+2*6/3",result=64. 解析: 考虑算术表达式计算规则: ...
- 2017年第八届蓝桥杯C/C++ A组国赛 —— 第三题:表达式计算
标题:表达式计算 虽然我们学了许久的程序设计,但对于简单的四则混合运算式,如果让我们完全白手起家地编程来解析,还是有点棘手. 这里,我们简化一下问题,假设只有加法和乘法,并且没有括号来改变优先级. 再 ...
- java算术表达式_一文了解如何用 Java 进行算术表达式计算
(给ImportNew加星标,提高Java技能) 编译:ImportNew/唐尤华 如何用Java计算"5+3"."10-40"."10*3" ...
- Fel表达式计算引擎学习
载原文地址:Fel是轻量级的高效的表达式计算引擎 Fel的问题 Fel的问题 Fel是轻量级的高效的表达式计算引擎 Fel在源自于企业项目,设计目标是为了满足不断变化的功能需求和性能需求. Fel是开 ...
- Fel轻量高效的表达式计算引擎
Fel是轻量级的高效的表达式计算引擎 Fel在源自于企业项目,设计目标是为了满足不断变化的功能需求和性能需求. Fel是开放的,引擎执行中的多个模块都可以扩展或替换.Fel的执行主要是通过函数实现,运 ...
- 零起点学算法07——复杂一点的表达式计算
零起点学算法07--复杂一点的表达式计算 Description 下面你来计算一个复杂一点的计算表达式 Input 没有输入 Output 输出表达式的值,保留2位小数 题目分析:根号要用sqrt来算 ...
- .NET平台开源项目速览(8)Expression Evaluator表达式计算组件使用
在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Expression Evaluator验证组件.那里只是概述了一下,并没有对其使用和强大功能做 ...
- 蓝桥杯-表达式计算(java)
算法训练 表达式计算 时间限制:1.0s 内存限制:256.0MB问题描述输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除.输入格式输入一行,包含一个表达式.输出格式输出这个表达 ...
- 中缀表达式计算、后缀表达式计算、中缀转后缀
代码来源 : bilibili网站 :https://www.bilibili.com/video/av91996256?from=search&seid=174497233083020298 ...
- 算法笔记_044:表达式计算求值(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的 ...
最新文章
- JVM---垃圾回收算法详解
- 服务器混合硬盘安装linux,UBUNTU下如何开启SSHD服务
- Cisco UCS 自述:我不仅仅是服务器, 更是一个完整的系统
- 海思芯片硬件java加速_海思Hi3719C V100芯片简介
- 服务器如何区分多个客户端的信息,如何从服务器向客户端发送已连接客户端的列表,以区分常规消息?...
- PLSQL Developer中数值字段由科学计数法改为普通数值显示
- AIoT时代的新思维
- charles请求转发_Charles安装与基本操作
- android 隐藏输入法时自动关闭弹窗,Android监听输入法弹窗和关闭的实现方法
- junit5 动态测试_JUnit 5嵌套测试
- 2021SC@SDUSC sm2算法原理(1)
- 数据挖掘基础知识点总结
- 取汉子拼音首字母的C#方法
- 规则引擎 Easy rule 使用总结
- HDMI2.1定义以及物理转换Bypass芯片详解
- ORACLE FORMS BUILDER的布局和常用ITEMS
- 不可不知!4种常见的黑客攻击手段
- 均值不等式链的几何证明
- Python环境搭建指南
- 数据结构笔记10-图的逻辑结构
热门文章
- oracle exception 循环,Oracle Exception In Loop
- ie 无法运行php,PHP会话无法在IE中运行
- leetcode 第2高的薪水 oracle_詹姆斯本赛季薪水3744万美元排在第6位,比他高的都有谁?...
- 一个3200位长的tcp报文传到ip层_运输层
- 电磁波考试中可以用计算机吗,计算机考试试题库带答案(8页)-原创力文档
- 计算机竞赛湖北有哪些,我校29名学生在全国大学生数学竞赛湖北赛区获奖
- 【BZOJ1434】【codevs2348】染色游戏,博弈
- 【codevs2304】【BZOJ1875】HH去散步,第一次的矩阵加速DP
- 【英语学习】【WOTD】two-bit 释义/词源/示例
- 【英语学习】【WOTD】cap-a-pie 释义/词源/示例