主要是栈的应用,里面有两个函数deleteSpace(),stringToDouble()在我还有一篇博客其中:对string的一些扩展函数。

本程序仅仅是主要的功能实现,没有差错控制。

#include<iostream>
#include<stack>
#include<string>
#include<map>
#include"fstring.h" /*
*採用逆波兰表示法求解数学表达示
*1、将输入的中缀表示示转换成后缀表达示
*2、将后缀表达示进行计算得出结果
*/
using namespace std; stack<string> postOrderStr;
map<string, int> symbolPriority;
void initializationSymbol(map<string, int>& symbol)
{//定义优先级
pair<string, int> element;
element = make_pair("+", 0);
symbol.insert(element); element = make_pair("-", 0);
symbol.insert(element); element = make_pair("*", 1);
symbol.insert(element); element = make_pair("/", 1);
symbol.insert(element);
} void strToPostStack(string& str, stack<string>& postOrderStr)
{//首先将输入的数学表达示表示成后缀表达示
stack<string> auxilary;//辅助数组。用于暂时存放符号
string::iterator iter = str.begin();
string::iterator iter1 = iter;
bool flag = false;//是否遇到括号
for (; iter != str.end(); ++iter)
{
if (*iter == '+' || *iter == '-' || *iter == '*' || *iter == '/' || *iter == '(' || *iter == ')')
{
if (iter1 != iter)
{//可能会出现两个连续的符号
string subStr(iter1, iter);
//存入数字
postOrderStr.push(subStr);
}
string symbol(iter,iter+1);//符号 //按优先级存入符号。
if (*iter == '(')
{
flag = true;
auxilary.push(symbol);
}
else if (flag && *iter != ')')
{
auxilary.push(symbol);
}
else if (!flag)
{
if (auxilary.empty())
{
auxilary.push(symbol);
}
else
{
string tmp2 = auxilary.top();
while (symbolPriority[tmp2] >= symbolPriority[symbol])
{
postOrderStr.push(tmp2);
auxilary.pop();
if (auxilary.empty())
break;
tmp2 = auxilary.top();
}
auxilary.push(symbol);
}
}
else if (flag && *iter == ')')
{
string tmp1 = auxilary.top();
do{
postOrderStr.push(tmp1);
auxilary.pop();
tmp1 = auxilary.top();
} while (tmp1!="(");
auxilary.pop();
flag = false;
} //存放下一个数字起始位置
iter1 = iter+1;
}
}
string tmp5(iter1, iter);
postOrderStr.push(tmp5);
while (!auxilary.empty())
{
string tmp6 = auxilary.top();
postOrderStr.push(tmp6);
auxilary.pop();
}
} double computeFun(stack<string> postOrderStrNew)
{//溢出控制
stack<double> computeStack;//计算辅助栈
while (!postOrderStrNew.empty())
{
string tmp7 = postOrderStrNew.top();
if (tmp7 == "+" || tmp7 == "-" || tmp7 == "*" || tmp7 == "/")
{//遇到符号则取出计算辅助栈中的两个元素開始计算,并将结果压入栈中
double value1, value2, value3;
value1 = computeStack.top();
computeStack.pop();
value2 = computeStack.top();
computeStack.pop();
if (tmp7 == "+")
{
value3 = value2 + value1;
}
else if (tmp7 == "-")
{
value3 = value2 - value1;
}
else if (tmp7 == "*")
{
value3 = value2 * value1;
}
else
{
value3 = value2 / value1;
}
computeStack.push(value3);
}
else
{
double value;
//把字符转换成数值,然后压入栈中
value = stringToDouble(tmp7);
computeStack.push(value);
}
postOrderStrNew.pop();
}
return computeStack.top();
} int main()
{
initializationSymbol(symbolPriority);
string mathStr;
cout << "Please input a math string:"<<endl;
getline(cin,mathStr);
cout << "The string you input is:" << endl;
deleteSpace(mathStr);
cout << mathStr<<endl;
strToPostStack(mathStr, postOrderStr);
stack<string> postOrderStrNew;
while (!postOrderStr.empty())
{
string tmp4 = postOrderStr.top();
//cout << tmp4 << " ";
//转存到还有一个栈中就是后缀表达示了
postOrderStrNew.push(tmp4);
postOrderStr.pop();
}
cout << endl;
cout << "The compute result is:"<<computeFun(postOrderStrNew)<<endl;
return 0;
}

逆波兰法求解数学表达示(C++)的更多相关文章

  1. 逆波兰法(计算器)程序<无括号版>

    涉及队列.栈的运用. Java中队列可以用: Queue<String> q = new LinkedList(); 来声明,其主要的方法有: poll(),peak(),offer(), ...

  2. LeetCode OJ:Evaluate Reverse Polish Notation(逆波兰表示法的计算器)

    Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...

  3. 关于利用STL栈求解四则中缀表达式以及中缀表达式转逆波兰表达式和逆波兰表达式的求解

    今天总结一下栈的一个重要应用---四则数学表达式的求解 数学表达式的求解是栈的一个重要的应用,在计算机的应用中 如果求解一个四则运算表达式,我们可能会直接写一个程序例如什么printf("% ...

  4. javascript:逆波兰式表示法计算表达式结果

    逆波兰式表示法,是由栈做基础的表达式,举个例子: 5 1 2 + 4 * + 3 -  等价于   5 + ((1 + 2) * 4) - 3 原理:依次将5 1 2 压入栈中, 这时遇到了运算符 + ...

  5. AC日记——逆波兰表达式 openjudge 3.3 1696

    1696:逆波兰表达式 总时间限制:  1000ms 内存限制:  65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式 ...

  6. noi1696 逆波兰表达式

    1696:逆波兰表达式 http://noi.openjudge.cn/ch0303/1696/ 总时间限制:  1000ms 内存限制:  65536kB 描述 逆波兰表达式是一种把运算符前置的算术 ...

  7. codevs5164 逆波兰表达式

    题目描述 Description 逆波兰表达式是一种把运算符前置的算术表达式(又叫前缀表达式),例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也 ...

  8. lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值

    题目 逆波兰表达式求值 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2", "1&q ...

  9. OpenJudge 2694 逆波兰表达式

    1.链接地址: http://bailian.openjudge.cn/practice/2694/ 2.题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算 ...

随机推荐

  1. Spring思维课程导图——bean属性的设置

  2. 记一次Oracle冷备恢复的过程

    一.故障来临 某日中午,市电意外中断,机房UPS电源由于负载过重而未接管供电,所有服务器全部重启...... 待所有服务器重启后,正在逐一检查设备和业务运行情况时,意外发生了.一台年代久远的HP PC ...

  3. Coursera公开课-Machine_learing:编程作业7

    这周的编程作业主要是两方面内容. 1.K-means聚类. 2.PCA(Principle Component Analys)主成分分析. 方式主要是通过对图像的聚类实现压缩图像,后来发现PCA也可以 ...

  4. 关于处理移动端Vue单页面及其内嵌兼容问题

    关于处理移动端Vue单页面及其内嵌兼容问题 question:由于最近转移了以前的H5项目,重构使用Vue单页面,导致部分手机内嵌或在微信浏览器中无法浏览,或者无法使用ajax请求:手机机型千变万化, ...

  5. maven 纯注解一步一步搭建Spring Mvc项目(入门)

    初次接触spring MVC项目,通过一段时间的学习,本文介绍一种以纯注解的方法去配置spring MVC环境,让那些配置的.xml文件统统见鬼吧. 什么是Spring MVC Spring MVC属 ...

  6. python gdal 修改shp文件的属性值

    driver = ogr.GetDriverByName('ESRI Shapefile')datasource = driver.Open(shpFileName, 1)layer = dataso ...

  7. Android项目实战_手机安全卫士程序锁

    ###1.两个页面切换的实现1. 可以使用Fragment,调用FragmentTransaction的hide和show方法2. 可以使用两个布局,设置visibility的VISIABLE和INV ...

  8. ionic2/3 禁止屏幕旋转,禁止横屏,竖屏

    ionic2/ionic3禁止屏幕旋转,及解除禁止旋转 1.添加插件: cmd到项目目录---> cordova plugin add cordova-plugin-screen-orienta ...

  9. win32窗口映射(部分)

    先理解一下“窗口”与“视区”的概念.“窗口”是逻辑坐标下的矩形区域,“视区”是设备坐标系下的区域.根据“窗口”和“视区”的大小可以确定x方向和y方向的比例因子. 例子如下: VOID OnPaint( ...

  10. html5——3D转换

    角度旋转 rotateX:默认以center绕x轴旋转 rotateY:默认以center绕y轴旋转 rotateZ:默认以cente绕z轴r旋转 //rotateX原点为center==>正值 ...