简单计算器(浙大复试上机)

前言:

21考研,不论能否进复试记录一下准备路上写下的垃圾代码。本来啃《算法笔记》,但是感觉太多了做不完,改做王道机试指南。

题目描述:

读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。

输入描述

测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。

输出描述:

对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。

解答

#include<iostream>
#include<string>
#include<vector>
#include<stack>
using namespace std;

void cal(stack<char>& sym,stack<double>& num) {
    
    
	double right, left;
	right = num.top();
	num.pop();
	left = num.top();
	num.pop();
	if (sym.top() == '+')
		num.push(right + left);
	else if (sym.top() == '-')
		num.push(left - right);
	else if (sym.top() == '*')
		num.push(left * right);
	else num.push(left / right);
	sym.pop();
}
int main() {
    
    
	string str,temp="";
	getline(cin,str);
	stack<double> num;
	stack<char> sym;
	double t = 0,left,right;
	for (int i = 0; i < str.length(); i++) {
    
    
		if (str[i] == ' ')
			continue;
		else if (str[i] >= '0' && str[i] <= '9') {
    
    
			while (str[i] != ' ') {
    
    
				temp += str[i];
				i++;
				if (i == str.length())
					break;
			}
			num.push(stoi(temp));
			temp = "";
		}
		else {
    
    
			if (str[i] == '/' || str[i] == '*') {
    
    
				if (sym.empty() == true || sym.top() == '+' || sym.top() == '-')
					sym.push(str[i]);
				else
				{
    
    
					while (sym.empty() == false && (sym.top() == '*' || sym.top() == '/'))
						cal(sym, num);
					sym.push(str[i]);
				}
			}
			else {
    
    
				while (sym.empty() == false)
					cal(sym, num);
				sym.push(str[i]);
			}
		}
	}
	while (sym.empty() == false) 
		cal(sym, num);
	printf("%.2lf\n", num.top());
	return 0;
}

学数据结构的时候学过,就带着印象复现了一下。

猜你喜欢

转载自blog.csdn.net/weixin_44897291/article/details/112981602
今日推荐