数据结构栈实现四则运算
来源:互联网 发布:什么是软件功能点 编辑:程序博客网 时间:2024/05/22 06:13
例如,计算9+(3-1)*3+8/2
思路:通过栈来实现上述元素,我们一般称上述表达式为中缀表达式,我们首先要将其转换为后缀表达式,因为中缀表达式不利于计算机运算。
上代码:
算法思路:
对字符串中的内容,遇到数字就输出,遇到符号则与栈顶元素比较优先级,若低,则将栈顶元素弹栈,若高,则压栈。若为右括号,则连续输出,直到遇到左括号,这输出的就是后缀表达式
其中isp()和icp()这两个函数是对于优先级的规定,在下一段代码中有它们的定义
void postfix(){ stack<char> s; char y; // s.makeEmpty(); s.push('#'); char ch[20]="9+(3-1)*3+8/2"; for(int i=0;i<13;i++){ if(isdigit(ch[i])) cout<<ch[i]; else if(ch[i]==')'){ // cout<<ch[i]<<endl; while(!(s.empty())&&(y=s.top())!='('){ cout<<y; s.pop(); } if(!s.empty()) s.pop(); } else{ while(!s.empty()&&isp(y=s.top())>icp(ch[i])){ cout<<y; s.pop(); } s.push(ch[i]); } } while(!s.empty()){ cout<<s.top(); s.pop(); }}
有了后缀表达式,我们需要的是计算,我们做的是,遇数字压栈,与符号则弹出前两个数进行计算,将结果入栈。
#include<cmath>#include<stack>#include<iostream>using namespace std;int isp(char ch){ switch(ch){ case '#': return 0; case '(': return 1; case '^': return 7; case '*': case '/': case '%': return 5; case '+': case '-': return 3; case ')': return 8; }}int icp(char ch){ switch(ch){ case '#': return 0; case '(': return 8; case '^': return 6; case '*': case '/': case '%': return 4; case '+': case '-': return 3; case ')': return 1; }}class Calculator{public: Calculator(){} double Run(); void Clear();private: void AddOperand(double value); bool Get2Operands(double &left,double &right); void DoOperator(char op); stack<double> s;};void Calculator::AddOperand(double value){ s.push(value);}void Calculator::Clear(){}bool Calculator::Get2Operands(double &left,double &right){ if(s.empty()){ cerr<<"Missing Operands!"<<endl; return false; } right = s.top(); s.pop(); if(s.empty()){ cerr<<"Missing Operands!"<<endl; return false; } left = s.top(); s.pop(); return true;}void Calculator::DoOperator(char op){ double left,right; bool result; result = Get2Operands(left,right); if(result==true){ switch(op){ case '+': s.push(left+right); break; case '-': s.push(left-right); break; case '*': s.push(left*right); break; case '/': if(abs(right)<=1E-6){ cerr<<"Divide By 0"<<endl; Clear(); } else s.push(left/right); break; /* case '^': s.push(left^right); break;*/ } } else{ Clear(); }}double Calculator::Run(){ char ch; double newoperand,ret; while(cin>>ch,ch!='='){ switch( ch ) { case '+': case '-': case '*': case '/': case '^': DoOperator(ch); break; default: cin.putback(ch); cin >> newoperand; AddOperand(newoperand); break; } } ret = s.top(); s.pop(); return ret;}int main(){ // postfix(); Calculator c; double ans = c.Run(); cout<<ans; return 0;}
阅读全文
0 0
- 数据结构栈实现四则运算
- 数据结构,C语言实现四则运算
- 【数据结构与算法】实现四则运算
- 数据结构之简单四则运算表达式求值8-(栈的实现)
- 算法实战5:多种数据结构实现四则运算
- 栈实现四则运算
- 用栈实现四则运算
- 栈实现四则运算
- 利用栈实现四则运算
- 四则运算 (数据结构)
- 数据结构:四则运算
- 用链式栈实现四则运算
- java 四则运算 栈的实现
- java 四则运算 栈的实现
- 四则运算(用栈实现)
- java利用栈实现四则运算
- 使用栈实现计算四则运算
- 栈 实现四则运算的计算器
- JDK8对并发的新支持
- new
- 在eclipse中安装groovy插件详细步骤
- LinkedHashMap 原理
- 内存溢出之Tomcat内存配置
- 数据结构栈实现四则运算
- mysql中的unix_timestamp函数
- Android View绘制流程
- Vue-cli安装过程
- Php给图片添加水印
- 使用p6spy监视mybatis输出sql
- ARM处理器中PC值=当前指令地址 + 8的根本原因
- HeadFirstPython---------(三)第五章(推倒数据__处理数据)
- Libevent 学习--------(eventop)事件多路分发器