博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构实验6
阅读量:3952 次
发布时间:2019-05-24

本文共 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/

你可能感兴趣的文章
Android开发——ListView局部刷新的实现
查看>>
Java技术——Java中的参数传值方式
查看>>
Android开发——本地验证码的简易实现
查看>>
Java技术——CopyOnWriteArrayList源码解析
查看>>
Java技术——ReentrantLock的Condition的作用以及使用
查看>>
数据结构——搜索树树、B-树、B+树
查看>>
Android开发——带你彻底理解 Window 和 WindowManager
查看>>
设计模式——责任链模式详解
查看>>
设计模式——适配器模式详解
查看>>
设计模式——装饰模式详解
查看>>
Android开发——关于RxJava的知识总结
查看>>
Android开发——View的生命周期总结
查看>>
Android开发——Protocol Buffer的使用(比XML、Json快很多)
查看>>
Android开发——Android系统启动以及App启动过程
查看>>
Android开发——简述RxJava框架的实现原理
查看>>
Android开发——今日头条APK瘦身之路
查看>>
Android开发——使用ActivityLifecycleCallbacks监控App是否处于后台
查看>>
Android开发——Protocol Buffer效率之高的原理介绍
查看>>
Android开发——贝塞尔曲线解析
查看>>
Android开发——微信Android架构历史
查看>>