九度OJ 1019 简单计算器

来源:互联网 发布:手机怎么创造软件 编辑:程序博客网 时间:2024/04/30 01:44

题目链接: http://ac.jobdu.com/problem.php?pid=1019


题目分析:

使用两个栈,一个存储数字数据,一个存储操作符号。判断*和/的时候,不入栈,直接通过判断计算前后数字乘除法操作后的值,顺序入数字栈。操作符栈最后只存储+和-符号。

都入栈完毕之后,由于是中缀表达式计算,计算顺序从左至右,这就需要将栈中数据逆置,采用导出到数组的方法。导出完毕后,依次从左至右开始计算,即可解决。


源代码:

#include <iostream>#include <iomanip>#include <stack>#include <stdlib.h>#include <stdio.h>using namespace std;int main(){stack<double> SD;//数字栈stack<char> SO;//操作符栈double left, right;//退栈时存储栈头数字int num;//输入数字char op;//输入操作符double data[1000];//数字数组char operate[1000];//操作符数组while (cin>>num)//读入开始数字{op = getchar();//读取数字后输入的字符if (num == 0 && op == '\n')//输入0后,退出{break;}SD.push(num);while (op == ' ')//数字后要跟空格{op = getchar();//读取空格后的操作符if (op == '\n')//输入回车后,程序结束{break;}if (!SO.empty() && (SO.top() == '*' || SO.top() == '/')){right = SD.top();SD.pop();left = SD.top();SD.pop();if (SO.top() == '*'){SD.push(left * right);}if (SO.top() == '/'){SD.push(left / right);}SO.pop();}SO.push(op);cin>>num;SD.push(num);op = getchar();//下一轮循环判断}if (SO.top() == '*' || SO.top() == '/'){right = SD.top();SD.pop();left = SD.top();SD.pop();if (SO.top() == '*'){SD.push(left * right);}else if (SO.top() == '/'){SD.push(left / right);}SO.pop();}//将堆栈数据保存到保存到数组中,从左向右计算int i = 0;int oplength, datalength;//栈内数据长度int optop, datatop;while (!SO.empty()){operate[i++] = SO.top();SO.pop();}oplength = i;optop = i - 1;i = 0;while (!SD.empty()){data[i++] = SD.top();SD.pop();}datalength = i;datatop = i - 1;for (int j = optop; j >= 0; j--){if (operate[j] == '+'){data[datatop - 1] = data[datatop] + data[datatop - 1];datatop --;}else if (operate[j] == '-'){data[datatop - 1] = data[datatop] - data[datatop - 1];datatop --;}}cout.setf(ios::fixed);cout<<setprecision(2)<<data[0]<<endl;}return 0;}