zoukankan      html  css  js  c++  java
  • 简单计算器

    简单计算器

    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


  • 相关阅读:
    关于数据库中浮点运算、保留小数和时间计算
    几个常用的操作
    数字转换为字符串
    Dll控件出错的处理办法
    小巧的服务程序源码(转)
    DELPHI中MDI子窗口的关闭和打开
    用Delphi创建服务程序
    Delphi如何获取QQ2010聊天窗口句柄?
    拖动Form上的图片,Form一起动
    仿药易通输入单位信息后如果没有则自动加入功能
  • 原文地址:https://www.cnblogs.com/Eleven-Qian-Shan/p/13064981.html
Copyright © 2011-2022 走看看