2017-06-27 19:19:18

第一步需要将中缀表达式转为后缀表达式。这步的转化可以说是本题的核心。

主要的转化手段是利用栈,有如下几个规则:

  • 数字直接输出
  • "("直接进栈
  • ")"将栈中元素出栈直到遇到"("
  • 其他运算符需要和栈顶元素比较优先级,如果栈顶元素的优先级小于等于待操作的运算符的,则需要出栈并输出。直到栈顶元素的优先级大于待处理元素
  • 最后需要将栈中元素清空,全部输出
int toint(string in)
{
int rst;
stringstream ss;
ss<<in;
ss>>rst;
return rst;
} int priority(char a)
{
switch(a)
{
case '*': return ;
case '/': return ;
case '+': return ;
case '-': return ;
case '(': return ;
case ')': return ;
}
} bool isdig(char a)
{
if(a>=''&&a<='') return true;
else return false;
} //保证每次入栈的符号的优先级都比当前的栈顶元素要高,若此时栈顶的优先级比入栈元素低或者等于的话,则需要出栈
//知道遇到比当前需要入栈元素优先级高的为止
void midtopost(string in,vector<string>& vec)
{
stack<char> s;
string rst="";
int i=;
while(true)
{
if(i>=in.length()) break;
if(isdig(in[i]))
{
string num="";
while(isdig(in[i])) num+=in[i++];
vec.push_back(num);
}
else
{
if(s.empty()) s.push(in[i++]);
else
{
if(in[i]=='(') {s.push(in[i]);}
else if(in[i]==')')
{
while(s.top()!='(')
{
string temp="";
temp+=s.top();
vec.push_back(temp);
s.pop();
}
s.pop();
}
else
{
if(priority(in[i])>priority(s.top())||s.top()=='(') s.push(in[i]);
else
{
//判断是否为空必须写在前面,符合短路原则
while(!s.empty()&&(priority(in[i])<=priority(s.top())))
{
string temp="";
temp+=s.top();
vec.push_back(temp);
s.pop();
}
s.push(in[i]);
}
}
++i;
} }
}
//清空栈
while(!s.empty())
{
string temp="";
temp+=s.top();
vec.push_back(temp);
s.pop();
}
} //后缀表达式的计算,数字进栈,符号将栈顶两个元素出栈,运算后进栈
int calc(vector<string>& vec)
{
stack<int> s;
for(int i=;i<vec.size();++i)
{
if(!vec[i].compare("*"))
{
int x=s.top();
s.pop();
int y=s.top();
s.pop();
s.push(x*y);
}
else if(!vec[i].compare("-"))
{
int x=s.top();
s.pop();
int y=s.top();
s.pop();
s.push(y-x);
}
else if(!vec[i].compare("+"))
{
int x=s.top();
s.pop();
int y=s.top();
s.pop();
s.push(x+y);
}
else if(!vec[i].compare("/"))
{
int x=s.top();
s.pop();
int y=s.top();
s.pop();
s.push(y/x);
}
else
{
s.push(toint(vec[i]));
}
}
return s.top();
} int main()
{
string in="9+(3-1)*3+10/2";
//string s="9 3 1 - 3 * + 10 2 / +";
vector<string> vec;
midtopost(in,vec);
cout<<calc(vec)<<endl;
return ;
}

C++ 利用栈解决运算问题的更多相关文章

  1. 【Java EE 学习 69 上】【struts2】【paramsPrepareParamsStack拦截器栈解决model对象和属性赋值冲突问题】

    昨天有同学问我问题,他告诉我他的Action中的一个属性明明提供了get/set方法,但是在方法中却获取不到表单中传递过来的值.代码如下(简化后的代码) public class UserAction ...

  2. 利用栈实现算术表达式求值(Java语言描述)

    利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...

  3. python 利用栈实现复杂计算器

    #第五周的作业--多功能计算器#1.实现加减乘除及括号的优先级的解析,不能使用eval功能,print(eval(equation))#2.解析复杂的计算,与真实的计算器结果一致#用户输入 1 - 2 ...

  4. 利用闭包解决for循环里onclick事件不能捕捉实时i值问题

    问题描述 我们都知道,如果我们对于一组元素(相同的标签)同时进行onclick事件处理的时候(在需要获取到索引的时候),一般是写一个for循环,但是onclick是一个异步调用的,所以会带来一个问题, ...

  5. 用栈解决Largest Rectangle问题

    一问题描述 Given n non-negative integers representing the histogram's bar height where the width of each ...

  6. [Java]利用栈判断括号是否完整配对

    利用栈实现判断字符串中的括号是否都是配对的. 主要算法是依次读取字符串中的每一个字符,如果是左括号则将左括号压入栈中,如果是右括号则从栈中弹出最上面的字符,若两者不是同种括号或栈内已经没有字符就返回f ...

  7. 利用Readability解决网页正文提取问题

    分享: 利用Readability解决网页正文提取问题   做数据抓取和分析的各位亲们, 有没有遇到下面的难题呢? - 如何从各式各样的网页中提取正文!? 虽然可以用SS为各种网站写脚本做解析, 但是 ...

  8. 利用gulp解决微信浏览器缓存问题

    做了好多项目,这次终于要解决微信浏览器缓存这个令人头疼的问题了.每次上传新的文件,在微信浏览器中访问时,总要先清除微信的缓存,实在麻烦,在网上搜罗了很多解决办法,终于找到了方法:利用gulp解决缓存问 ...

  9. hdu 3666(差分约束,手动栈解决超时问题)

    THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

随机推荐

  1. C#+Aspose.Cells 导出Excel及设置样式 (Webform/Winform)

    在项目中用到,特此记录下来,Aspose.Cells 不依赖机器装没有装EXCEL都可以导出,很方便.具体可以参考其他 http://www.aspose.com/docs/display/cells ...

  2. head first java读书笔记

    head first java读书笔记 1. 基本信息 页数:689 阅读起止日期:20170104-20170215 2. 标签 Java入门 3. 价值 8分 4. 主题 使用面向对象的思路介绍J ...

  3. linux常用命令:iostat 命令

    Linux系统中的 iostat 是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视.它的特点是汇报磁盘活动统计情况,同时也会 汇报出CPU使用情况 ...

  4. SQL学习之SQL注入学习总结

    所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 测试数据库 我们本文就以如下数据库作为测试数据库,完成我们的注入分析 ...

  5. Python Web学习笔记之socket编程

    Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...

  6. Spring IOC 源码分析

    Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的 IOC 容器.既然大家平时都要用到 Spring,怎么可以不好好了解 Spring 呢?阅读本文 ...

  7. Python3 pip出现Fatal error in launcher: Unable to create process using '"'

    Python3 pip出现Fatal error in launcher: Unable to create process using '"' 问题分析: 先python2又安装了pyth ...

  8. 20145127《java程序设计》第五周学习总结

    教材学习内容总结 第八章 异常处理 1.try catch java中所有错误会被打包成对象,可以进行尝试捕捉代表错误的对象进行处理. Import java.until.Scanner; Publi ...

  9. CRT中的时间(time_t和tm)(转载)

    转载:http://blog.csdn.net/bokee/article/details/5330682 首先介绍基本的时间概念. 时间一般分为两种,一种是本地时间(Local Time),一种是协 ...

  10. 利用Qt开发跨平台APP

    本文将手把手教你如何在Windows环境下,使用Qt编译出安卓应用程序. Qt是一个优秀的跨平台开发工具.我们利用Qt可以很方便地将一次编写的应用,多次编译到不同平台上,如Windows.Linux. ...