C/C++带括号四则运算
来源:互联网 发布:代理商授权书源码系统 编辑:程序博客网 时间:2024/04/28 07:11
(1).首先从string读入表达式,取出每一个字符后装入deque容器coll1中(源码在后面)。
(2).从该容器取出每一个元素,利用栈将中缀表达式转换成后缀表达式(可参考:http://blog.csdn.net/anye3000/article/details/7939203),将后缀表达式装入容器coll3中。
(3).最后从coll3中取出元素逐一处理,既使用逆波兰式求值(如下图)。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
C++源码
可编译并正常运行,此程序只支持一位数字运算,例如 3*(2+8)/5+6,有需要多位运算或者浮点型运算请自行修改,原理相同。
#include<stack>#include<iostream>#include<deque>#include<string>using namespace std;//判断是否为括号bool isPra(char c) {if(c=='('||c==')') return true; else return false;}//获得符号的优先性int getPri(char c) {switch(c) {case '+':case '-':return 0;//如果是加减,返回0break;case '*':case '/':return 1;//如果是乘除,返回1break;case '(':case ')':return -1; //注意,这里将括号设为最低优先级,因此括号不会被弹出,除非遇到右括号break; }}//判断符号的优先性void check(char c, stack<char>& coll2, deque<char>& coll3) { if(coll2.empty()) {coll2.push(c);return;} if(isPra(c)) {if(c=='(') coll2.push(c);else {//弹出所有元素直到遇到左括号while(coll2.top()!='(') { char ch = coll2.top();coll3.push_back(ch);coll2.pop();}//当遇到左括号时,弹出但不加入coll3(后缀表达式中)coll2.pop(); }}else//如果不是括号{//取出栈顶元素,与当前符号进行优先性比较char sym = coll2.top(); //比较两符号的优先性if(getPri(c)<=getPri(sym)) {//如果c的优先性比栈顶符号小或等于,弹出栈顶元素coll2.pop();//并将其压入coll3(后缀表达式)中coll3.push_back(sym);//递归调用check,比较当前符号c与下一个栈顶符号的优先性check(c,coll2,coll3);}else {//如果c比栈顶符号优先级大,那将c压入coll2(操作符栈)中coll2.push(c); }}}//从coll中取出元素,分配元素到coll2和coll3中void allocate(deque<char>& coll1, stack<char>& coll2, deque<char>& coll3) { while(!coll1.empty()) {char c = coll1.front();coll1.pop_front();if(c>='0'&&c<='9'){coll3.push_back(c);}else {//调用check函数,针对不同情况作出不同操作check(c,coll2,coll3); }}//如果输入结束,将coll2的元素全部弹出,加入后缀表达式中while(!coll2.empty()) { char c = coll2.top();coll3.push_back(c);coll2.pop();}}//计算后缀表达式void calculate(deque<char>& coll3, stack<int>& coll4) { while(!coll3.empty()) {char c = coll3.front();coll3.pop_front();//如果是操作数,压入栈中if(c>='0'&&c<='9') {//减去'0'得出偏移值,即为真实数值(如果直接转换成int,结果不对,因为char 转换为int是其编码值,例如'1'的编码值为49int op = c-'0'; coll4.push(op); }else //如果是操作符,从栈中弹出元素进行计算{ int op1 = coll4.top();coll4.pop();int op2 = coll4.top();coll4.pop();switch(c) {case '+':coll4.push(op2+op1);break;case '-':coll4.push(op2-op1);break;case '*':coll4.push(op2*op1);break;case '/':coll4.push(op2/op1); //注意是op2(op)op1而不是op1(op)op2break;}}}}int main(){deque<char> coll1; //盛放中缀表达式stack<char> coll2; //盛放操作符deque<char> coll3;//盛放后缀表达式stack<int>coll4;//计算后缀表达式的辅助容器string str;cout<<"请输入表达式,按enter结束:"<<endl;cin>>str;for(int i=0;i!=str.size();++i) {//逐一加入每个字符,这里使用deque因为deque在两端删除添加的速度最快coll1.push_back(str[i]); } //从coll中取出元素,分配元素到coll2和coll3中allocate(coll1,coll2,coll3); //计算后缀表达式calculate(coll3,coll4); cout<<"计算结果为:"<<coll4.top()<<endl;}
- C/C++带括号四则运算
- C/C++带括号四则运算
- C/C++带括号的四则运算
- 带括号的四则运算C语言实现
- 带括号的四则运算
- 带括号的四则运算 汇编
- [C++] new带括号和不带括号
- [C++]new带括号和不带括号
- 0-9 带括号的四则运算
- 不带括号的四则运算步骤
- java 实现带括号的加减乘除四则运算
- 计算带括号的四则运算表达式
- 不带括号的简单四则运算
- c++栈之带括号的四则运算
- 四则运算(带括号)的小程序
- [编程题]带括号的四则运算
- 一个简单的四则运算程序C语言实现--无法处理括号
- 一个简单的四则运算程序C语言实现--实现处理括号
- timer
- 安装 xampp
- 《构建高性能的web站点》读书笔记--组件分离
- 高德完美获取地理位置信息并显示出来~~
- Battery eliminator circuit
- C/C++带括号四则运算
- ABAP中CHECKBOX 和LISTBOX的使用(屏幕字段的控制)1
- FTP文件上传与下载(JAVA)
- android sqlite数据库增删改查
- IM-A820L第一屏与第二屏已破(非开机动画)(应该泛泰机型通用)
- C#发送邮件(添加附件)!
- 洗牌算法
- python os模块总结
- CSS浮动属性Float详解