九度1019

来源:互联网 发布:数据库 什么是触发器 编辑:程序博客网 时间:2024/06/07 11:10
题目描述:
    读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
输入:
    测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
输出:
    对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
这道题就是考查数据结构,在很多数据结构的课本上都有讲解应用栈模拟计算器,此题没有括号,难度小一点,但有些地方要注意一下。

首先,就是题目中有描述:整数和运算符之间用一个空格分隔。所以在输入字符串的时候 最好不要用scanf等,可以使用gets进行输入。其次,在进行减、除计算的时候要留意,数字在弹出栈的时候跟进栈不一样,所以不要弄反了。最后,从栈中读取数据用top()函数,读取之后要删除的话不要忘记!

#include<stdio.h>#include<stack>using namespace std;#define SIZE 201stack<double>n;stack<int>op;char buf[SIZE];int flag;int pri[5][5]={0,0,0,0,0,//#1,1,1,0,0,//+1,1,1,0,0,//-1,1,1,1,1,//*1,1,1,1,1,///};void getnext(char *&p,double &num,int &opt)//problem1{num=0;if((*p)>='0'&&(*p)<='9'){flag=1;while((*p)!=' '&&(*p)!='\0'){num=num*10+(*p)-'0';p++;}}else if((*p)!='\0'){switch(*p){case '+':opt=1;break;case '-':opt=2;break;case '*':opt=3;break;case '/':opt=4;break;}flag=-1;p++;}else flag=0;if((*p)!='\0')p++;}int main(){while(gets(buf))//有空格的地方输入要特别注意! {if(buf[0]=='0'&&buf[1]=='\0')break;char *p=buf;double num;int opt1;int opt2;op.push(0);while(1){getnext(p,num,opt1);if(flag==1){n.push(num);}else if(flag==-1){opt2=op.top();if(pri[opt2][opt1]==0)op.push(opt1);else{while(pri[opt2][opt1])//顺序 {double num1=n.top();n.pop();double num2=n.top();n.pop();switch(opt2){case 1:n.push(num1+num2);break;case 2:n.push(num2-num1);break;case 3:n.push(num1*num2);break;case 4:n.push(num2/num1);break;}op.pop(); opt2=op.top(); //不要忘记删除! }op.push(opt1);}}else if(flag==0)break;}int opt0=op.top();while(opt0){double num1=n.top();n.pop();double num2=n.top();n.pop();switch(opt0){case 1:n.push(num1+num2);break;case 2:n.push(num2-num1);break;case 3:n.push(num1*num2);break;case 4:n.push(num2/num1);break;}op.pop();opt0=op.top();}num=n.top();printf("%.2lf\n",num);}return 0;}


0 0
原创粉丝点击