简单的栈计算器

来源:互联网 发布:市政技术杂志知乎 编辑:程序博客网 时间: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
原创粉丝点击