简单计算器

简单计算器

http://codeup.cn/problem.php?cid=100000605&pid=0

前言:

一道典型的Stack(栈)的应用题,思路简单,但是比较考验编码能力(有很多编码细节,一不注意,你就没了QAQ

PS:杭电也有这样的题,长得几乎一模一样,但是不知道为什么杭电上AC的代码Codeup上这道题就是过不了,大雾???(stack做出后,在看其他解法的时候发现的)


题目简述:

计算表达式中只含有+、-、×、/,计算给出的表达式的值,保留小数点后两位输出。

输入中含有数字、空格、计算符、回车。

当一行输入中只含0时,输入结束。

解题思路:

遇到这种表达式求值的题,一般就是将中缀表达式转换为后缀表达式,然后用两个stack分别存储运算符和数字,根据计算符的优先级进行弹出运算。

注意:大多数题目中还是会涉及到括号的情况,只不过这道题难度降了(我依旧编了很久很久)。如果有括号,则还要判断括号的优先级

代码Code:

#include <bits/stdc++.h>
using namespace std;
stack<char> op; //存运算符 
stack<double> num; //存数字 
char s[10001];

inline int check(char ops) { //比较运算符的优先级 
	if(ops=='*'||ops=='/') return 2;
	if(ops=='+'||ops=='-') return 1;
}

int main() {
	while(gets(s)!=NULL&&strcmp("0",s)) { //strcmp为字符串比较函数,此处为比较s与0是否完全相等 
		int i=0,t=0;
		while(s[i]||!op.empty()) { //注意,是||不是&& 
			if(s[i]==' ') i++; //直接跳过空格 
			else if(s[i]>='0'&&s[i]<='9') { //处理数字 
				t=t*10+s[i]-'0';
				i++;
				if(!(s[i]>='0'&&s[i]<='9')) { //一段数字处理完了就存进num中 
					num.push(t);
					t=0; //记得清零 
				}
			}
			else if(op.empty()||check(s[i])>check(op.top())){ 
			//处理符号(如果op栈为空,则直接存入;否则根据优先级,优先级大就存入) 
				op.push(s[i]);
				i++;
			}
			else {
				char opss=op.top();
				double x=num.top();
				num.pop();
				double y=num.top();
				num.pop();
				if(opss=='*') num.push(x*y); 
				else if(opss=='/') num.push(y/x); //注意一下除法和减法,因为是后缀 
				else if(opss=='+') num.push(x+y);
				else num.push(y-x);
				op.pop();
			}
		}
		printf("%.2lf
",num.top());
	}
	return 0;
}

后序:

网上很多人是用两个queue或者一个queue+stack做的,在此就不多赘述了。

提供一个用两个queue做的题解,宣传一下qwq:

https://www.cnblogs.com/bzzs/p/13049194.html


原文地址:https://www.cnblogs.com/Eleven-Qian-Shan/p/13064981.html