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-表达式计算相关推荐

  1. [算法 笔记]字符串表达式计算(简易版)

    题目:编写一个函数,计算字符串中表达式的值,参数中只包含计算符:+,-,*,/等.例如,str="10+50+2*6/3",result=64. 解析: 考虑算术表达式计算规则: ...

  2. 2017年第八届蓝桥杯C/C++ A组国赛 —— 第三题:表达式计算

    标题:表达式计算 虽然我们学了许久的程序设计,但对于简单的四则混合运算式,如果让我们完全白手起家地编程来解析,还是有点棘手. 这里,我们简化一下问题,假设只有加法和乘法,并且没有括号来改变优先级. 再 ...

  3. java算术表达式_一文了解如何用 Java 进行算术表达式计算

    (给ImportNew加星标,提高Java技能) 编译:ImportNew/唐尤华 如何用Java计算"5+3"."10-40"."10*3" ...

  4. Fel表达式计算引擎学习

    载原文地址:Fel是轻量级的高效的表达式计算引擎 Fel的问题 Fel的问题 Fel是轻量级的高效的表达式计算引擎 Fel在源自于企业项目,设计目标是为了满足不断变化的功能需求和性能需求. Fel是开 ...

  5. Fel轻量高效的表达式计算引擎

    Fel是轻量级的高效的表达式计算引擎 Fel在源自于企业项目,设计目标是为了满足不断变化的功能需求和性能需求. Fel是开放的,引擎执行中的多个模块都可以扩展或替换.Fel的执行主要是通过函数实现,运 ...

  6. 零起点学算法07——复杂一点的表达式计算

    零起点学算法07--复杂一点的表达式计算 Description 下面你来计算一个复杂一点的计算表达式 Input 没有输入 Output 输出表达式的值,保留2位小数 题目分析:根号要用sqrt来算 ...

  7. .NET平台开源项目速览(8)Expression Evaluator表达式计算组件使用

    在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Expression Evaluator验证组件.那里只是概述了一下,并没有对其使用和强大功能做 ...

  8. 蓝桥杯-表达式计算(java)

    算法训练 表达式计算 时间限制:1.0s 内存限制:256.0MB问题描述输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除.输入格式输入一行,包含一个表达式.输出格式输出这个表达 ...

  9. 中缀表达式计算、后缀表达式计算、中缀转后缀

    代码来源 : bilibili网站 :https://www.bilibili.com/video/av91996256?from=search&seid=174497233083020298 ...

  10. 算法笔记_044:表达式计算求值(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的 ...

最新文章

  1. JVM---垃圾回收算法详解
  2. 服务器混合硬盘安装linux,UBUNTU下如何开启SSHD服务
  3. Cisco UCS 自述:我不仅仅是服务器, 更是一个完整的系统
  4. 海思芯片硬件java加速_海思Hi3719C V100芯片简介
  5. 服务器如何区分多个客户端的信息,如何从服务器向客户端发送已连接客户端的列表,以区分常规消息?...
  6. PLSQL Developer中数值字段由科学计数法改为普通数值显示
  7. AIoT时代的新思维
  8. charles请求转发_Charles安装与基本操作
  9. android 隐藏输入法时自动关闭弹窗,Android监听输入法弹窗和关闭的实现方法
  10. junit5 动态测试_JUnit 5嵌套测试
  11. 2021SC@SDUSC sm2算法原理(1)
  12. 数据挖掘基础知识点总结
  13. 取汉子拼音首字母的C#方法
  14. 规则引擎 Easy rule 使用总结
  15. HDMI2.1定义以及物理转换Bypass芯片详解
  16. ORACLE FORMS BUILDER的布局和常用ITEMS
  17. 不可不知!4种常见的黑客攻击手段
  18. 均值不等式链的几何证明
  19. Python环境搭建指南
  20. 数据结构笔记10-图的逻辑结构

热门文章

  1. oracle exception 循环,Oracle Exception In Loop
  2. ie 无法运行php,PHP会话无法在IE中运行
  3. leetcode 第2高的薪水 oracle_詹姆斯本赛季薪水3744万美元排在第6位,比他高的都有谁?...
  4. 一个3200位长的tcp报文传到ip层_运输层
  5. 电磁波考试中可以用计算机吗,计算机考试试题库带答案(8页)-原创力文档
  6. 计算机竞赛湖北有哪些,我校29名学生在全国大学生数学竞赛湖北赛区获奖
  7. 【BZOJ1434】【codevs2348】染色游戏,博弈
  8. 【codevs2304】【BZOJ1875】HH去散步,第一次的矩阵加速DP
  9. 【英语学习】【WOTD】two-bit 释义/词源/示例
  10. 【英语学习】【WOTD】cap-a-pie 释义/词源/示例