命令行的公式计算器
scturtle
posted @ 2009年11月18日 00:21
in Other
, 1700 阅读
明天要交的实验的一部分 支持加减乘除括号 配合实验用的书上的堆栈类
#include <iostream> #include <cstring> #include <cstdlib> using namespace std; #include "lstack.h" double calc(char* s,int head,int end) { int j,kuo;//j中是第一个括号后的那个位置 kuo用来括号匹配时计数 double a,b; //操作数 char o; //操作符 LinkedStack<double> num; num.Add(0); LinkedStack<char> op; for(int i=head; i<end; i++) { if(isdigit(s[i])) //是数字 加进操作数栈中 { num.Add(atof(s+i)); while(isdigit(s[i+1])|s[i+1]=='.') i++; continue; } if(s[i]=='(') //是括号 找到匹配括号递归 { i++; j=i; kuo=1; while(kuo) //找匹配括号 { i++; if(s[i]=='(') kuo++; else if(s[i]==')') kuo--; } num.Add(calc(s,j,i)); //递归 continue; } switch (s[i]) { case '+': case '-': op.Add(s[i]); //加减直接加 最后再运算 break; case '*': num.Delete(a); if(s[++i]!='(') //乘除转换为加减 { b=atof(s+i); while(isdigit(s[i+1])|s[i+1]=='.') i++; b=a*b; } else //考虑下一个不是操作数是括号 { j=i+1; kuo=1; while(kuo) //找匹配括号 { i++; if(s[i]=='(') kuo++; else if(s[i]==')') kuo--; } b=calc(s,j,i); b*=a; } num.Add(b); break; case '/': num.Delete(a); if(s[++i]!='(')//乘除转换为加减 { b=atof(s+i); while(isdigit(s[i+1])|s[i+1]=='.') i++; b=a/b; } else //考虑下一个不是操作数是括号 { j=i+1; kuo=1; while(kuo) //找匹配括号 { i++; if(s[i]=='(') kuo++; else if(s[i]==')') kuo--; } b=calc(s,j,i); b=a/b; } num.Add(b); break; } } b=0; while(!op.IsEmpty()) //全转化为加减后 直接计算 { op.Delete(o); num.Delete(a); //cout<<a<<o; if(o=='+') b+=a; else b-=a; } num.Delete(a); //cout<<a; b+=a; //cout<<"temp = "<<b<<endl; return b; } int main() { char s[200]; while(1) { cin>>s; cout<<"="<<calc(s,0,strlen(s))<<endl; } }