简单的栈计算器
来源:互联网 发布:市政技术杂志知乎 编辑:程序博客网 时间:2024/06/05 19:32
分块处理
1.遇到数字
2.遇到运算符
3.遇到左括号
4.遇到右括号
5.遇到等号
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
源码:
#include<iostream>#include<stack>using namespace std;const int maxlen=50;bool flag=true; stack <double>S;//操作数 stack <char>F; //运算符 int gb(char x){//设置运算优先级别if(x=='-' || x=='+') return 2;if(x=='*' || x=='/') return 3;if(x=='(' || x==')') return 1;cout<<"输入的等式有误"<<endl;flag=false;return 0;}double ys(double i1,double i2,char f)//简单的四则运算{if(f=='+'){return (i2+i1);}if(f=='-'){return (i2-i1);}if(f=='*'){return (i2*i1);}if(f=='/'){return (i2/i1);}cout<<"输入的等式有误"<<endl;flag=false;return 0;}int main(){cout<<"********************************************************************************"<<endl;cout<<"********************************************************************************"<<endl;cout<<" 本计算器只能使用英文括号,请注意!"<<endl;cout<<"********************************************************************************"<<endl;cout<<"********************************************************************************"<<endl;int sum=0;//用于计数小数点后面的数的个数char f;double k,i1,i2,i3;int i,j,m;string arry;//等式 cout<<"输入式子"<<endl;cin>>arry;for(j=0;j<maxlen;j++){if(arry[j]=='\0')break;}cout<<"等式长度为"<<j<<endl;for(i=0;i<j;i++){if(arry[i]>='0'&&arry[i]<='9'){k=1;doubles=arry[i]-48;//字符数字转化为int类型i++;while(arry[i]>='0'&&arry[i]<='9'){//判断是否读完一个数字s=s*10+(arry[i]-48);i++;}m=i;if(arry[m]=='.'){//判断为小数时候的情况m++;while(arry[m]>='0'&&arry[m]<='9'){sum++;m++;}for(int l=1;l<=sum;l++)//同判断数字的方法{k=k*10;double h;h=(arry[i+l]-48)/k;s=s+h;}i=i+sum+1;//因为‘.’号与后面的数字的数量所以要i+sum(小数数量)+1(逗号数量)sum=0; }S.push(s);//放入栈内cout<<"数据 "<<s<<" 入栈"<<endl;i=i-1;continue;}if(F.empty()==true){//F空cout<<"符号栈为空"<<endl;F.push(arry[i]);cout<<"栈入第一个符号"<<arry[i]<<endl;continue;}if(arry[i]=='('){cout<<"遇到左括号\n左括号入栈"<<endl;F.push(arry[i]);continue;}if(arry[i]==')'){cout<<"遇到右括号"<<endl;while((f=F.top())!='(' ){F.pop();cout<<"栈顶不为左括号"<<endl;cout<<"取出运算符栈栈顶"<<f<<endl;i1=S.top();S.pop();i2=S.top();S.pop();cout<<"栈出数栈栈顶两个数i1="<<i1<<" i2="<<i2<<endl;i3=ys(i1,i2,f);cout<<"求得i3为"<<i3<<" 并栈入"<<endl;S.push(i3);} cout<<"栈顶为左括号"<<endl;F.pop();cout<<"删去左括号"<<endl;continue;}if(arry[i]=='='){cout<<"遇到等号"<<endl;i1=S.top();S.pop();i2=S.top();S.pop();cout<<"栈出数栈栈顶两个数i1="<<i1<<" i2="<<i2<<endl;f=F.top();F.pop();cout<<"取出运算符栈栈顶"<<f<<endl;i3=ys(i1,i2,f);if(F.empty()==true){if(flag==true)cout<<"计算结果是"<<i3<<endl;elsecout<<"计算出错,可能是由于所给等式不符合要求"<<endl;return 0;}else{S.push(i3);i=i-1;continue;}}f=F.top();F.pop();cout<<"取出运算符栈栈顶 "<<f<<endl;if(gb(arry[i])>gb(f)){F.push(f);F.push(arry[i]);cout<<"当前运算符"<<arry[i]<<"优先级大于前一运算符"<<endl;cout<<"将"<<f<<" "<<arry[i]<<"入栈"<<endl;continue;}else{cout<<"当前运算符"<<arry[i]<<"优先级小于等于前一运算符"<<endl;i1=S.top();S.pop();i2=S.top();S.pop();cout<<"栈出数栈栈顶两个数i1="<<i1<<" i2="<<i2<<endl;i3=ys(i1,i2,f);cout<<"求得i3为 "<<i3<<" 并栈入"<<endl;S.push(i3);i=i-1;continue;}}cout<<"程序运行错误"<<endl;return 0;}
0 0
- 简单的栈计算器
- 栈的作业:简单计算器
- 栈实现的简单计算器
- 栈的应用 - 简单计算器
- 栈实现简单的计算器
- hdu1237简单的计算器(栈)
- 栈的应用--简单计算器---加减乘除
- 用栈实现简单的计算器
- java栈实现简单的计算器
- 简单的四则计算器
- 简单的计算器程序
- 简单的java计算器
- 简单的计算器
- 小型简单的计算器
- 一个简单的计算器
- 简单的计算器代码
- 简单的计算器制作
- 简单的计算器
- 二元选择排序
- 为什么年事已高的我还在编程?
- 13期 3月期刊自荐
- 里式七大设计原则
- 3天掌握目标达成术:第一天
- 简单的栈计算器
- 单源最短路径
- 百元买百鸡
- 数据结构--AVL树
- [小雅轩观点]002谈指针类型的作用
- 重在坚持
- webstorm
- C#类和继承
- C#通用类库--DOS常用命令