本文共 2922 字,大约阅读时间需要 9 分钟。
因为精度问题,请使用double存数据。
要求 创建栈类,采用数组描述; 计算数学表达式的值。 输入数学表达式,输出表达式的计算结果。数学表达式由单个数字和运算符+、-、、/、(、)构成,例如 2+3(4+5)–6/4。假定表达式输入格式合法。 格式 输入 第一行一个整数n(1<=n<=100),代表表达式的个数。 接下来n行,每行一个表达式,保证表达式内的数字为单个整数,表达式内各运算符和数字间没有空格,且表达式的长度不超过2000。 输出 每行表达式输出一个浮点数,要求保留两位小数,保证输入表达式合法。 样例 输入 3 1+6/17+214+9/1+209+9+7/(95)-16-08-7-92+6-(0-5-28-7-95(6-5526-2-7-5+67+69-100+30+2/1-6/6+5)) 0-4-1/6*(1-(6/7)-4+6+2+61)-17+2-82+0-(4+6-61+(3-86/4-6-5)6/4/8+7-14/95)-0/6+1-0-2+7-2+64-36+2/8+6+162 5-39+5/15-9+18-6-8-41+5-2+9/32-2/5/(2-6)2/7-90-2+4/6678-8-86+89*(3+01/5/278+0-88-5+8/5*2-0) 输出 -9197.84 -3.47 -4362.57 限制 1s, 65536KiB for each test case.#include#include #include #include using namespace std;//定义一个数组栈 template class arraystack{ public: arraystack(int initialCapacity=10);//构造函数 ~arraystack(){ delete [] stack;}//析构函数 bool empty() const { return stackTop==-1;} int size() const { return stackTop+1;} T& top(){ if(stackTop==-1) exit(1); return stack[stackTop]; } void pop() { if(stackTop==-1) exit(1); stack[stackTop--].~T();//T的析构函数 } void push(const T& theElement); private: int stackTop; int stackLength; T *stack;};//构造函数 template arraystack ::arraystack(int initialCapacity){ if(initialCapacity<1) exit(1); stackLength=initialCapacity; stack=new T[stackLength]; stackTop=-1; } template void arraystack ::push(const T& theElement){ //将元素theElement压入栈 if(stackTop==stackLength-1){ //judge if the capacity is full stackLength*=2; //将栈的容量扩充二倍 T newStack[stackLength]; for(int i=0;i &n, arraystack &c){ //定义运算,将数字栈的前两个数和符号栈栈顶元素取出做一次运算 并将结果压入数字栈 if(c.top()=='(') return; double a,b; a=n.top(); n.pop(); //弹出栈顶元素 b=n.top(); n.pop(); //弹出栈顶元素 switch(c.top()) { //根据符号栈的栈顶元素不同进行不同运算 case '+': n.push(a+b); break; case '-': n.push(b-a); break; case '*': n.push(a*b); break; case '/': n.push(b/a); break; default:break; } c.pop();//将运算完的符号弹出栈 }void operate(string s,int length) { bool flag=false; arraystack n(length); //声明一个数字栈 arraystack c(length); //声明一个字符栈 for(int i=0;i ='0'&&s[i]<='9') { int k=s[i]-'0'; while(s[i+1]>='0'&&s[i+1]<='9') { k=10*k+(s[i+1]-'0'); i++; } if(flag){ k=-k; flag=false; } n.push(k); } else { //读到的是字符 if((i==0||s[i-1]=='(')&&s[i]=='-') { flag=true; continue; } switch(s[i]){ case '+': case '-': if(c.empty()||c.top()=='(') c.push(s[i]); else{ calculate(n,c); if(!c.empty()&&c.top()!='(') calculate(n,c); c.push(s[i]); } break; case '*': case '/': if(c.empty()||c.top()=='(') c.push(s[i]); else if(c.top()=='+'||c.top()=='-') c.push(s[i]); else if(c.top()=='*'||c.top()=='/') { calculate(n,c); c.push(s[i]); } break; case '('://左括号直接入栈 c.push(s[i]); break; case ')'://遇到右括号 ,对括号内运算直至运算到左括号 while (c.top()!='(') { calculate(n,c); } c.pop();//将左括号弹出栈 break; default:break; } } } while(!c.empty()) calculate(n,c); cout< < < < >n; for(int i=0;i >str; length=str.length(); operate(str,length); } return 0;}
转载地址:http://jfwzi.baihongyu.com/