1019.简单计算器

题目描述:

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

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

    对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
样例输入:
1 + 2
4 + 2 * 5 - 7 / 11
0
样例输出:
3.00
13.36

Solution1:

#include<stdio.h>
#define Max 200
int main(){
    double stack[Max];
    int top,i,n;
    double d,num,count;
    char symbol,space;
    while(scanf("%d ",&n)!=EOF&&n){
        top=0;
        stack[++top]=1.0*n;
        while(scanf("%c%lf%c",&symbol,&num,&space)!=EOF){
            if(symbol ==‘+‘){
                stack[++top]=num;
            }else if(symbol==‘-‘){
                stack[++top]=-1*num;
            }else if(symbol==‘*‘){
                stack[top]=stack[top]*num;
            }else if(symbol==‘/‘){
                stack[top]=stack[top]/num;
            }
            if(space!=‘ ‘){
                    break;
            }
        }
        count=0;
        for(i=1;i<=top;i++)
            count+=stack[i];
        printf("%.2lf\n",count);

    }
    return 0;
}

Solution2:

#include<stack>
#include<stdio.h>
using namespace std;

char str[220];
int mat[][5]={
        1,0,0,0,0,
        1,0,0,0,0,
        1,0,0,0,0,
        1,1,1,0,0,
        1,1,1,0,0
};
stack<int> op;
stack<double> in;
void getop(bool &reto,int &retn,int &i){
    if(i==0 && op.empty()==true){
        reto=true;
        retn=0;
        return;
    }
    if(str[i]==0){
        reto=true;
        retn=0;
        return;
    }
    if(str[i]>=‘0‘ && str[i]<=‘9‘){
        reto=false;
    }
    else{
        reto=true;
        if(str[i]==‘+‘){
            retn=1;
        }
        else if(str[i]==‘-‘){
            retn=2;
        }
        else if(str[i]==‘*‘){
            retn=3;
        }
        else if(str[i]==‘/‘){
            retn=4;
        }
        i+=2;
        return;
    }
    retn=0;
    for(;str[i]!=‘ ‘ && str[i]!=0;i++){
        retn*=10;
        retn+=str[i]-‘0‘;
    }
    if(str[i]==‘ ‘) i++;
    return;
}

int main(){
    while(gets(str)){
        if(str[0]==‘0‘ && str[1]==‘0‘) break;
        bool retop;
        int retnum;
        int idx=0;
        while(!op.empty()) op.pop();
        while(!in.empty()) in.pop();
        while(true){
            getop(retop,retnum,idx);
            if(retop==false){
                in.push((double)retnum);
            }
            else{
                double temp;
                if(op.empty()==true || mat[retnum][op.top()]==1){
                    op.push(retnum);
                }
                else{
                    while(mat[retnum][op.top()]==0){
                        int ret=op.top();
                        op.pop();
                        double b=in.top();
                        in.pop();
                        double a=in.top();
                        in.pop();
                        if(ret==1) temp=a+b;
                        else if(ret==2) temp=a-b;
                        else if(ret==3) temp=a*b;
                        else temp=a/b;
                        in.push(temp);
                    }
                    op.push(retnum);
                }
            }
            if(op.size()==2 && op.top()==0) break;
        }
        printf("%.2f\n",in.top());
    }
    return 0;
}

原文地址:https://www.cnblogs.com/bernieloveslife/p/9736637.html

时间: 2024-10-03 22:29:32

1019.简单计算器的相关文章

[JAVA][HDU 1237][九度 1019][简单计算器]

本来以为是一道很简单的stack题目,居然花了四五十分钟来解决,JAVA本身就有stack的应用优势,但还是花了自己很多时间.. 提供一些要点吧: 1.首先是来自九度的测试案例 1 + 2 5 4 + 2 * 5 - 7 / 11 3 0 + 5 1 - 2 * 3 * 4 + 5 * 6 1 * 2 * 3 + 5 + 6 - 7 * 8 + 9 / 10 0 + 0 * 0 1 + 5 * 0 0 + 5 0 2.输入0时结束,但是运算到0的时候不结束,这个应该很容易排除 3.输出之前再检查

题目1019:简单计算器(栈的使用)

题目链接:http://ac.jobdu.com/problem.php?pid=1019 题目具体分析见:https://github.com/zpfbuaa/JobduInCPlusPlus   参考代码: // // 1019 简单计算器.cpp // oj // // Created by PengFei_Zheng on 04/04/2017. // Copyright © 2017 PengFei_Zheng. All rights reserved. // #include <st

j2ee-JSP之简单计算器

来源韩顺平.j2ee视频实战教程jsp第1讲(下集) -------------------------------------------------------------------------------------------------------- 简单计算器,可以控制输入的数(仅第一个数)不能为空且不能为字符串 myCal.jsp代码 1 <!--这是计算器的界面 --> 2 <!-- 可以控制输入的数不能为空且不能为字符串 --> 3 <%@ page co

JAVA编写的简单计算器

package com.hellojava.practice.test; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.Panel; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; impo

HDU1237 简单计算器 【栈】+【逆波兰式】

版本:1.0 日期:2014.5.17 2014.6.1 版权:© 2014 kince 转载注明出处 在介绍SwitchButton之前,先来看一下系统Button是如何实现的.源码如下: @RemoteView public class Button extends TextView { public Button(Context context) { this(context, null); } public Button(Context context, AttributeSet att

[Java.web]简单计算器

项目的  WebRoot 目录下的 calculator.jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML> <html> <head> <title>计算结果</title> </head> <body> <jsp:us

NOIP19:简单计算器

/* 1.4编程基础之逻辑表达式与条件分支 19:简单计算器 总时间限制: 1000ms 内存限制: 65536kB 描述 一个最简单的计算器,支持+, -, *, / 四种运算.仅需考虑输入输出为整数的情况,数据和运算结果不会超过int表示的范围. 输入 输入只有一行,共有三个参数,其中第1.2个参数为整数,第3个参数为操作符(+,-,*,/). 输出 输出只有一行,一个整数,为运算结果.然而: 1. 如果出现除数为0的情况,则输出:Divided by zero! 2. 如果出现无效的操作符

hdoj 1237 简单计算器

简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 14512    Accepted Submission(s): 4920 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整

Shell 实现简单计算器功能

Shell 实现简单计算器功能,脚本如下: [[email protected] scripts]# cat jisuan.sh #!/bin/bash print_usage(){     printf $"USAGE:$0 NUM1 {+|-|*|/} NUM2\n"     exit 1 } #判断传入的参数是不是3个 if [ $# -ne 3 ]   then     print_usage fi firstnum=$1 secondnum=$3 op=$2 #对传入的参数进