博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
逆波兰表达式计算加减乘除
阅读量:3952 次
发布时间:2019-05-24

本文共 2317 字,大约阅读时间需要 7 分钟。

输入

复制
“(2*(3-4))*5”
返回值
复制
-10

算法思路

1.用栈保存各部分计算的和

2.遍历表达式
3.遇到数字时继续遍历求这个完整的数字的值
4.遇到左括号时递归求这个括号里面的表达式的值
5.遇到运算符时或者到表达式末尾时,就去计算上一个运算符并把计算结果push进栈,然后保存新的运算符
如果是+,不要计算,push进去
如果是-,push进去负的当前数
如果是×、÷,pop出一个运算数和当前数作计算
6.最后把栈中的结果求和即可

class Solution {
stack
num; stack
sig; int com(int a,int b,char x) {
if (x=='+') return a+b; if (x=='*') return a*b; if (x=='-') return a-b; if (x == '/' && b) return a/b; return -9999999; } void calc() {
int b = num.top(); num.pop(); int a = num.top(); num.pop(); char op = sig.top();sig.pop(); num.push (com(a,b,op)); } void changes(string s) {
for (int i=0;i
0 && s[i-1] == '(') s.insert(i,"0"); } } return; } public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 返回表达式的值 * @param s string字符串 待计算的表达式 * @return int整型 */ int solve(string s) {
// write code here if (s.empty()) return -1; changes(s); for (int i=0;i
='0' && e<='9' && i
='0' && j<=s.size()) {
temp = temp*10 +(s[j]-'0'); ++j; } num.push(temp); i = j-1; }else {
char e = s[i]; if (e=='(' || sig.empty()) {
sig.push(e); } else{
if (s[i] =='+' || s[i] == '-') {
while (sig.size() && sig.top()!='('){
calc(); } sig.push(s[i]); } if (s[i]=='*' || s[i] =='/') {
// 要和栈前面的进行计算 while(sig.size() && (sig.top()=='*'||sig.top()=='/')) calc(); sig.push(s[i]); } if (s[i] ==')') {
while (sig.size() && sig.top() !='(' ){
calc(); } sig.pop(); } } } } while (sig.size()) calc(); return num.top(); }};

转载地址:http://ouyzi.baihongyu.com/

你可能感兴趣的文章
浅析dev目录下设备文件mknod节点gid,uid和mode的如何方便设置
查看>>
Android 加速度传感器 (G-Sensor) 收
查看>>
Linux 下如何 做patch 和打patch
查看>>
device_driver结构体
查看>>
模拟是本土仪表技术落后的原因之一
查看>>
锂电池驱动分析
查看>>
Android电源管理
查看>>
Android电源管理机制分析(zz)
查看>>
kobject与sysfs
查看>>
sysfs 文件系统
查看>>
Linux 内核/sys 文件系统之sysfs 属性文件
查看>>
Google_android_JNI使用方法
查看>>
Android JNI
查看>>
ARM与嵌入式linux如何入门
查看>>
git命令入门
查看>>
PreferenceActivity 全接触
查看>>
Android之PreferenceActivity
查看>>
在Ubuntu上搭建嵌入式Linux开发环境
查看>>
C语言数据类型:联合(union)
查看>>
记录每次更新到仓库
查看>>