逆波兰法求解数学表达示(C++)
主要是栈的应用,里面有两个函数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++)的更多相关文章
- 逆波兰法(计算器)程序<无括号版>
涉及队列.栈的运用. Java中队列可以用: Queue<String> q = new LinkedList(); 来声明,其主要的方法有: poll(),peak(),offer(), ...
- LeetCode OJ:Evaluate Reverse Polish Notation(逆波兰表示法的计算器)
Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...
- 关于利用STL栈求解四则中缀表达式以及中缀表达式转逆波兰表达式和逆波兰表达式的求解
今天总结一下栈的一个重要应用---四则数学表达式的求解 数学表达式的求解是栈的一个重要的应用,在计算机的应用中 如果求解一个四则运算表达式,我们可能会直接写一个程序例如什么printf("% ...
- javascript:逆波兰式表示法计算表达式结果
逆波兰式表示法,是由栈做基础的表达式,举个例子: 5 1 2 + 4 * + 3 - 等价于 5 + ((1 + 2) * 4) - 3 原理:依次将5 1 2 压入栈中, 这时遇到了运算符 + ...
- AC日记——逆波兰表达式 openjudge 3.3 1696
1696:逆波兰表达式 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式 ...
- noi1696 逆波兰表达式
1696:逆波兰表达式 http://noi.openjudge.cn/ch0303/1696/ 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算符前置的算术 ...
- codevs5164 逆波兰表达式
题目描述 Description 逆波兰表达式是一种把运算符前置的算术表达式(又叫前缀表达式),例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也 ...
- lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值
题目 逆波兰表达式求值 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2", "1&q ...
- OpenJudge 2694 逆波兰表达式
1.链接地址: http://bailian.openjudge.cn/practice/2694/ 2.题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算 ...
随机推荐
- Spring思维课程导图——bean得实例化和bean的管理
- Linux查找目录下的按时间过滤的文件
在维护项目中,有时会指定都一些条件进行过滤文件,并对该批文件进行操作:这时我们将使用shell命令进行操作:直接上代码 #!/bin/sh #BEGIN #`find ./ ! -name " ...
- C++中 list与vector的区别
引用http://www.cnblogs.com/shijingjing07/p/5587719.html C++ vector和list的区别 1.vector数据结构vector和数组类似,拥有一 ...
- wordpress登录账号之后才能查看页面,实例
函数: <?php auth_redirect(); ?> 例子: 要求用户登录才能查看页面 if(!is_user_logged_in()){ auth_redirect(); } 源文 ...
- ajax不跳转页面的快速删除操作,可添加美观样式
以前我们讲的删除是利用嵌入php代码,跳转到另一个页面,从而降低了删除速度,但我们今天讲的利用ajax不仅可以达到不跳页面快速删除,并且能添加特效来美化页面. 上代码,我们先来做主页面 <!DO ...
- Beta Edition [ Group 1 ]
DeltaFish Beta Edition 一.七月开发过程 小组会议 DeltaFish 校园物资共享平台 第八次小组会议 GITHUB https://github.com/DeltaFishS ...
- html5——文本阴影
基本结构 text-shadow: 30px 23px 31px #;/* 文字阴影: 水平位移 垂直位移 模糊程度 阴影颜色*/ 凹凸文字 <!DOCTYPE html> <htm ...
- RAID技术简单分析
RAID技术解析 RAID:独立磁盘冗余阵列(Redundant Array of Independent Disks) RAID技术就是将许多块硬盘设备组合成一个容量更大.更安全的硬盘组,可以将数据 ...
- Nrpe 插件安装教程
Nrpe 插件安装教程 blog地址: http://www.cnblogs.com/caoguo 一.nagios plugins的安装 [root@Nrpe ~]# yum install -y ...
- 在oninitdialog后添加初始化变量
需要 UpdateData(FALSE); 刷新界面 不然有时会不显示.