简单计算器问题

问题:读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值并写出算法。

回答:

#include<iostream>
#include<stack>
#include<string>
using namespace std;
char Precede(char a,char b);
double operate(double a1,char c,double b1);
int main()
{
    stack<double> opnd;
    stack<char> optr;
    string s;
    char theta,c;
    int i,k;
    double a,b;
    while(getline(cin,s),s!="0")
    {
        opnd.push(s[0]-48);
        i=0;
        c=s[++i];
        while(c!=‘\0‘)
        {
            if(c==‘ ‘)
            {
                c=s[++i];
                continue;
            }
            if(c>=‘0‘&&c<=‘9‘)
            {
                if(s[i-1]>=‘0‘&&s[i-1]<=‘9‘)//此处重要,比如32字符是连续的多个不是单个
                {
                    a=opnd.top()*10+c-48;
                    opnd.pop();
                    opnd.push(a);
                }
                else
                opnd.push(c-48);
                c=s[++i];
            }
            else
            {
                if(optr.empty()!=true)
                {
                    switch(Precede(optr.top(),c))//重点:运算符的优先级
                    {
                        case ‘<‘:optr.push(c);c=s[++i];break;//如果前一个运算符比后一个下就进栈
                        case ‘>‘:theta=optr.top();//此处进行运算,并没有进栈,因为我是前面字符和后面字符比较
                                 optr.pop();      //只有前面字符优先级高才运算
                                 a=opnd.top();
                                 opnd.pop();
                                 b=opnd.top();
                                 opnd.pop();
                                 opnd.push(operate(b,theta,a));
                                 break;
                     }
                 }
                else
                {
                    optr.push(c);
                    c=s[++i];
                }
            }
        }
        while(optr.empty()!=true)//因为我先输入数字,可能最后剩下运算符没有处理
        {
             theta=optr.top();
             optr.pop();
             a=opnd.top();
             opnd.pop();
             b=opnd.top();
             opnd.pop();
             opnd.push(operate(b,theta,a));
        }
        printf("%.2lf\n",opnd.top());
    }
    return 0;
}
char Precede(char a,char b)//比较运算符的优先级
{
    if(a==‘+‘||a==‘-‘)
    {
        switch(b)
        {
            case ‘+‘:
            case ‘-‘:return ‘>‘;break;
            case ‘*‘:
            case ‘/‘:return ‘<‘;break;
        }
    }
    if(a==‘*‘||a==‘/‘)
    return ‘>‘;
}
double operate(double a,char c,double b)//运算
{
    switch(c)
    {
        case ‘+‘:return (a+b);break;
        case ‘-‘:return (a-b);break;
        case ‘*‘:return a*b;break;
        case ‘/‘:return a/b;break;
    }
}

时间: 2024-10-18 09:03:23

简单计算器问题的相关文章

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 #对传入的参数进

Javascript 实现简单计算器实例代码

Javascript 实现简单计算器实例代码 这篇文章主要介绍了Javascript 实现简单计算器实例代码的相关资料,需要的朋友可以参考下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

菜鸟学Android编程——简单计算器《一》

菜鸟瞎搞,高手莫进 本人菜鸟一枚,最近在学Android编程,网上看了一些视频教程,于是想着平时手机上的计算器应该很简单,自己何不尝试着做一个呢? 于是就冒冒失失的开撸了. 简单计算器嘛,功能当然很少,加减乘除就可以. 第一步:设计布局文件 界面如下图: 由于刚开始学Android,对布局文件也不是很了解,边查边找,最后凑合着写好了布局文件. 注意事项:此布局文件用到了GridLayout布局,是在Android4.0以上才出现的(不知道谷歌有没有开发相应的包来适配4.0以下版本). 有关Gri

HDU 1237 简单计算器

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