中序表达式转后序(计算版)
来源:互联网 发布:js清除history 编辑:程序博客网 时间:2024/06/05 18:48
以前写了一个中序表达式转后序表达式,今天发现有一部分是错的,现在进行更正:
而关于如何将中序表达式转为后序表达式。可以参考上面的做法,建立两个栈s1和s2,s1存储后序表达式的结果,s2存储运算符号。从左到右遍历,如果当前符号是数字则推入s1,如果当前符号是”(“推入s2,如果当前符号是”)”,将(之前的符号都弹出,推入s1;如果当前符号的优先级大于s2的顶部,则推入栈,否则一直弹出直到当前符号的优先级大于等于s2的顶部。最后把s2的所有符号都推入s1。
这里有一些错误,如果当前栈顶计算符号的优先级大于等于的当前计算符号,则弹出进行计算,直到栈为空或栈顶的计算符号小于当前计算符号上次没有注意这一点,所以有一点错误。现在进行更正。更正后的代码如下:
相关问题描述可以参见https://leetcode.com/problems/basic-calculator/#/description
不过这里我进行了改进可以计算加减乘除。
代码如下:
class Solution {public: //改进版可以计算加减乘除 bool compare(char op1, char op2) { if (op1 == '*' || op1 == '/') { if (op2 == '+' || op2 == '-') { return 1; } else { return 0; } } else if (op1 == '+' || op1 == '-') { if (op2 == '*' || op2 == '/') { return -1; } else { return 0; } } return 0; } int calNumber(char op, int num1, int num2) { if (op == '+') { return (num1 + num2); } else if (op == '-') { return (num1 - num2); } else if (op == '*') { return (num1 * num2); } else if (op == '/') { return (num1 / num2); } return -1; } int calculate(string s) { if (s.size() == 0) { return 0; } stack<int> num; stack<char> op; int i = 0; while (i < s.size()) { if (s[i] == ' ') { i++; continue; } if (s[i] == '(') { op.push(s[i++]); } else if (s[i] == ')') { while (op.top() != '(') { int num2 = num.top(); num.pop(); int num1 = num.top(); num.pop(); num.push(calNumber(op.top(), num1, num2)); op.pop(); } op.pop(); i++; } else if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/') { while (!op.empty() && compare(op.top(), s[i] ) >= 0 && op.top() != '(') { int num2 = num.top(); num.pop(); int num1 = num.top(); num.pop(); num.push(calNumber(op.top(), num1, num2)); op.pop(); } op.push(s[i]); i++; } else { int n = 0; while (i < s.size() && s[i] == ' ') { i++; } while (i < s.size() && s[i] >= '0' && s[i] <= '9') { n = n * 10 + (s[i++] - '0'); } num.push(n); } } while (!op.empty()) { int num2 = num.top(); num.pop(); int num1 = num.top(); num.pop(); num.push(calNumber(op.top(), num1, num2)); op.pop(); } return num.top(); }};
有时候我问题没想清楚就写博客了,所以会有一些错误,如果大家发现了可以在评论里面告诉我,或者私信我。
0 0
- 中序表达式转后序(计算版)
- 中序表达式的直接计算
- 表达式计算(C++版)
- 中序表达式转后序表达式
- C#中表达式的计算
- C# 中实现表达式计算
- java中计算字符串表达式
- 中序表达式->逆波兰式->计算结果
- 表达式计算-Python版
- 表达式计算(二)
- 表达式计算(1)
- 计算表达式(栈)
- 表达式计算(中序转后序)
- 表达式计算(栈)
- shell 中test表达式、基本计算、位运算(转)
- Java 中缀表达式转后缀表达式 + 中/后缀表达式计算
- Java栈实现括号匹配、中序转后序表达式、中序表达式直接计算
- 中序表达式转后序表达式(带括号)
- 微信自媒体
- Codeforces 472D Design Tutorial: Inverse the Problem【MST+SPFA+思维】
- Android ble setCharactersticNotification() 依然无法收到通知
- java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/项目包名
- 广度优先搜索算法—BFS
- 中序表达式转后序(计算版)
- SRM554 Div1Medium TheBrickTowerMediumDivOne
- 最短路练习9/poj/2240 Arbitrage;正环:floyd或spfa解法;
- DFS水题
- 整理的前端面试题1
- java模拟银行存取钱业务
- bean的实例化方法
- 无缝轮播图片
- Apache/Tomcat/JBOSS/Nginx区别