github地址

iOS计算器

准备工作

由于OC没有自带的栈文件,只能链表模拟栈

typedef struct {char data[50];int top;
}Stack;//符号栈
//之前把Double写成了Char改了两天的bug后来还是岳靖翔哥哥改好的
//爱岳靖翔哥哥
typedef struct {double data[50];int top;
}StackNum;//数字栈

需要用到的方法

//出栈
- (void) pop:(Stack *)stack {stack->top = stack->top-1;
}
//进符号栈
- (void) pushfu: (char)s: (Stack *)stack {stack->top++;stack->data[stack->top] = s;
}
//进数字栈
- (void) pushshu: (double)s: (StackNum *)stack {stack->top++;stack->data[stack->top] = s;
}
//判断栈空
- (BOOL)isEmpty:(Stack *)stack {if (stack->top == -1) {return true;} else {return false;}
}
//判断运算符优先级
- (int) whoFirst:(char) c {if (c == '('){return 0;} else if (c == '+' || c == '-') {return 1;} else if (c == '*' || c == '/') {return 2;}return 0;
}
//数字运算 用于之后的后缀表达式求值
- (double) jieshu: (double)a : (double)b : (char)c {if (c == '+')return a + b;if (c == '-')return a - b;if (c == '*')return a * b;if (c == '/')return a / b;return 0;
}
//括号是否匹配 用于后来按下计算器中等于键之后的防止括号不匹配问题
- (BOOL) piPei: (char *)s {int len = strlen(s);for (int i = 0; i<len; i++) {if(s[i]=='('&&s[i+1]==')')return false;}Stack *stack = malloc(sizeof(Stack));stack->top = -1;for (int i = 0; i<len; i++) {if (s[i] == '(') {stack->top++;}if (s[i] == ')') {if(stack->top == -1)return false;stack->top--;}}if (stack->top == -1) {return true;}else {return false;}return false;
}

重点方法

- (double) end:(char *)s {//表达式数组char ans[500];int k = 0;int len = strlen(s);s[len] = '=';//开辟两个栈Stack *fuhao = malloc(sizeof(Stack));fuhao->top = -1;StackNum *shu = malloc(sizeof(StackNum));shu->top = -1;//中缀转后缀for (int i = 0; i <= len; i++) {if ((s[i]>='0' && s[i] <= '9') || s[i] =='.'){ans[k++] = s[i];} else if(s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/') {ans[k++] = '#';if ([self isEmpty:fuhao]) {[self pushfu:s[i] :fuhao];} else {while (![self isEmpty:fuhao] && [self whoFirst:fuhao->data[fuhao->top]] >=  [self whoFirst:s[i]]) {ans[k++] = fuhao->data[fuhao->top];fuhao->top--;}[self pushfu:s[i] :fuhao];}} else if (s[i] == '(') {[self pushfu:s[i] :fuhao];} else if(s[i]==')') {while(fuhao->data[fuhao->top] != '(') {ans[k++] = fuhao->data[fuhao->top];fuhao->top--;}fuhao->top--;;} else if(s[i] == '=') {while(![self isEmpty:fuhao]) {ans[k++] = fuhao->data[fuhao->top];fuhao->top--;}}}//验证是否转换成功//比如0.2*5-1(中缀表达式//转换成0.2#5#*1-(后缀表达式puts(ans);//后缀表达式求值int pos = 0;for (int i = 0; i < k; i++) {pos = 0;if (ans[i] >= '0' && ans[i] <= '9') {for(int j = i; j < k; j++) {if ((ans[j] >= '0' && ans[j] <= '9') || ans[j] == '.') {pos++;} else {break;}}double h = 1, sum1 = 0, sum2 = 0;for (int j = i + pos - 1; j >= i; j--) {if (ans[j] >= '0' && ans[j] <= '9') {sum1 += (ans[j] - '0') * h;h *= 10;} else if (ans[j] == '.') {sum1 /= h;h = 1;sum2 += sum1;sum1 = 0;}}sum2 += sum1;[self pushshu:sum2 :shu];i += pos - 1;} else if (ans[i] == '+'|| ans[i] == '-'|| ans[i] == '*'|| ans[i] == '/') {double x = shu->data[shu->top];shu->top--;double y = shu->data[shu->top];shu->top--;shu->top++;shu->data[shu->top] = [self jieshu :y :x :ans[i] ];}}return shu->data[shu->top];
}

完整代码就是上面的加起来 组成MVC设计模式中的M

iOS仿写计算器中缀转后缀 表达式求值相关推荐

  1. c 语言表达式求值中缀变后缀,表达式求值关于中缀式转后缀式的问题!

    已结贴√ 问题点数:10 回复次数:6 表达式求值关于中缀式转后缀式的问题! 本人看资料的时候遇到一段代码,这段代码中转为后缀式的优先级那句不明白,请大神赐教,代码如下(c语言) #include # ...

  2. 前缀,中缀,后缀表达式求值

    前缀表达式求值: 对于一个前缀表达式的求值而言,首先要从右至左扫描表达式,从右边第一个字符开始判断,如果当前字符是数字则一直到数字串的末尾再记录下来,如果是运算符,则将右边离得最近的两个"数 ...

  3. 顺序栈计算器 中缀转后缀表达式

    顺序栈计算器 中缀转后缀表达式 前言 一.后缀表达式简述 二.参考书目中的函数实现 1.输入一个后缀表达式并计算 2.将中缀转后缀表达式 三.在原方法基础上改写并结合两个方法 1.输入一个后缀表达式并 ...

  4. 使用栈解决的一类经典问题:表达式转换及求值;中缀表达式;前缀表达式,后缀表达式,中缀转前缀;中缀转后缀;后缀表达式求值;波兰式,逆波兰式

    文章目录 背景知识 表达式转换问题(考研经典) 一:手工转换 (1)中缀转前缀和中缀转后缀 (2)前缀转中缀和后缀转中缀 二:用栈实现表达式转换 (1)中缀转后缀 (2)中缀转前缀 表达式计算问题(使 ...

  5. 表达式求值(中缀转后缀及后缀表达式求值)

    .中缀表达式转后缀表达式: 中缀表达式转后缀表达式遵循以下原则: 1.遇到操作数,直接输出: 2.栈为空时,遇到运算符,入栈: 3.遇到左括号,将其入栈: 4.遇到右括号,执行出栈操作,并将出栈的元素 ...

  6. c++实现中缀转前缀,中缀转后缀,后缀表达式求值

    中缀转前缀 思想: 用两个栈实现,规则如下: (1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2: (2) 从右至左扫描中缀表达式: (3) 遇到操作数时,将其压入S2: (4) 遇到运算符时, ...

  7. java求值不用后缀表达式_数据结构之后缀表达式求值(java实现)

    数据结构之后缀表达式求值(java实现) 前记 ​ 今天在刷leet code的时候刷到了一道题,后缀表达式(逆波兰表达式)求值,我花了一会儿写了一下它的解法.但是今天我不谈什么是后缀表达式,有兴趣的 ...

  8. 栈应用:后缀表达式求值

    在上一篇博客 栈应用:中缀表达式转后缀表达式 中我们知道如何通过栈将中缀表达式转为后缀表达式,这次我们继续用栈 来实现后缀表达式求值,结合上一篇博客. 上一篇博客中是用c语言实现的,由于c语言中不支持 ...

  9. 后缀表达式求值和转换(C++)

    中缀转后缀 #include<stdio.h> #include<stack> using namespace std; stack<int> s; int com ...

最新文章

  1. jd-gui的下载和使用
  2. ARP协议全面实战手册——Wireshark的安装第一更
  3. java url 生成图片_JAVA 通过URL生成水印图
  4. 0x0000050蓝屏srvsys_win7电脑出现蓝屏0x00000050提示srv.sys如何解决[多图]
  5. 72万奖金!DCIC 2021数据竞赛正式报名了!
  6. [转]史上最全的CSS hack方式一览
  7. mysql 酒店管理设计_酒店管理系统的设计与实现(Myeclipse,MySQL)
  8. python 读取当前文件夹下所有后缀为.lib文件
  9. Webpack - 自学笔记
  10. 需求简报_代码简报:NASA将所有研究成果发布为开放数据
  11. LeetCode--171--Excel表列序号
  12. turtle填充随机颜色同心圆
  13. FisherYates费雪耶兹随机置乱算法
  14. 1106 Lowest Price in Supply Chain(25 分)
  15. 正版操作系统下载大全
  16. 网易BUFF产品体验报告
  17. 基于MapGIS的GIS二次开发作业文档
  18. worldpress小工具自定义html,教程 | 用 worldpress 搭建自己的博客 – 小白教程
  19. mysql 复合索引 悲观锁_对MySQL索引、锁及事务的简单分析
  20. Flowable工作流引擎技术方案

热门文章

  1. 数据挖掘之Apriori频繁项集挖掘
  2. 2020/4/11 斗图啦多线程爬取表情包
  3. 隐马尔科夫模型HMM(二) -- 估计问题
  4. R语言ggplot2可视化可视化排序的棒棒糖图、类似于排序的条形图(Lollipop Chart)、为可视化图像添加标题和副标题、题注信息、自定义轴坐标文本的角度
  5. 背包DP | 找零钱问题
  6. 协方差分析 | ANCOVA (Analysis of Covariance)
  7. 耗电优化(三):JobScheduler,WorkManager
  8. pythonic_Pythonic 是什么意思?
  9. Java 后端工程师的书单推荐
  10. c语言给任意字符串最后加一个结束符