简易计算器(但你得保证输入合法哟)

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <string>
#include <cstdlib>
#include <stdio.h>
#include<algorithm>
#include<stack>
using namespace std;

class calc{
private:
    char * expression;
    enum token {OPAREN,ADD,SUB,MULTI,DIV,EXP,CPAREN,VALUE,ENL};
    void Binaryop(token op, stack<int> &datastack);//
    token getop(int &value);//

public:
    calc(char* s);
    ~calc(){delete [] expression;}
    int result();

};

calc::calc(char*s)
{
    expression = new char[strlen(s)+1];
    strcpy(expression,s);
}

calc::token calc::getop(int &value)
{
    value = 0;
    while(*expression)
    {
        while(*expression && *expression == ‘ ‘)
            ++expression;
        if(*expression >= ‘0‘ && *expression <= ‘9‘)
        {
            while(*expression >= ‘0‘ && *expression <= ‘9‘)
            {
                value = value * 10 + (*expression)-‘0‘;
                expression ++;
            }
            return VALUE;
        }
        switch (*expression)
        {
        case ‘(‘: expression++;return OPAREN;break;
        case ‘)‘: expression++;return CPAREN;break;
        case ‘+‘: expression++;return ADD;break;
        case ‘-‘: expression++;return SUB;break;
        case ‘*‘: expression++;return MULTI;break;
        case ‘/‘: expression++;return DIV;break;
        case ‘^‘: expression++;return EXP;break;
        default:
            break;
        }

    }
    return ENL;
}
void calc::Binaryop(token op, stack<int> & datastack)
{
    int num2 = datastack.top();
    datastack.pop();
    int num1 = datastack.top();
    datastack.pop();
    switch (op)
    {
    case ADD: datastack.push(num1+num2);break;
    case SUB: datastack.push(num1-num2);break;
    case MULTI: datastack.push(num1*num2);break;
    case DIV: datastack.push(num1/num2);break;
    case EXP: datastack.push(pow(num1,num2));break;
    default:
        break;
    }

}

int calc::result()
{
    token nextop,topop;
    stack<token> opstack;
    stack<int> datastack;
    int resultvalue;
    int currentvalue;
    while(1)
    {
        currentvalue = 0;
        nextop = getop(currentvalue);
        if (nextop==ENL) break;
        switch (nextop)
        {
        case VALUE:datastack.push(currentvalue);break;
        case OPAREN:opstack.push(OPAREN);break;
        case EXP: opstack.push(EXP);break;
        case ADD: case SUB:
            while(!(opstack.empty()) && (topop=opstack.top())!=OPAREN)
            {
                Binaryop(opstack.top(),datastack);
                opstack.pop();
            }
            opstack.push(nextop);break;
        case MULTI: case DIV:
            while(!(opstack.empty()) && (topop= opstack.top())!=OPAREN && topop>= MULTI)
            {
                Binaryop(opstack.top(),datastack);
                opstack.pop();
            }
            opstack.push(nextop);break;
        case CPAREN:
            while(!(opstack.empty()) && (topop = opstack.top())!=OPAREN)
            {
                Binaryop(topop,datastack);
                opstack.pop();
            }
            opstack.pop();break;

        default:
            break;
        }

    }
    while(!opstack.empty())
    {
        Binaryop(opstack.top(),datastack);
        opstack.pop();
    }
    return datastack.top();
}

char data[101000];
int main(){
    scanf("%s",data);
    calc tmp(data);
    cout<<tmp.result();

    getchar();
    getchar();
    return 0;
}
时间: 2024-11-08 20:57:51

简易计算器(但你得保证输入合法哟)的相关文章

项目——简易计算器

2017.12.21 决定做一个小项目来练练手了,对期末考试感到无所畏惧. 先选择简易计算器吧,核心算法中缀转后缀表达式我还是学过的,最起码能克服一点心里畏惧. 项目预期如下: 实现命令行版本的核心算法,做简单的加减乘除就可以了: 实现图形化窗口. 代码预期要200行以上. 对自己提一个要求:可以上网找思路,但是绝对不看别人的源码. 2017.12.23 经过几天的努力,总算把这个计算器的核心代码写出来了.代码接近200行,主要利用二重字符串来实现核心的逆波兰算法,实在是有点繁杂. 这段代码实在

函数调用_猜数字和简易计算器

package app1; import java.util.*; public class TestFunction{     public static void main(String[] args){         Scanner sc=new Scanner(System.in);         System.out.print("请选择一项应用:\n1.猜数字\n2.简易计算器");         int n=sc.nextInt();         switch(

基于mini2440简易计算器

基于mini2440简易计算器使用的是数组实现,并非逆波兰式,因此功能不够强大,仅供驱动学习,以及C语言基础编程学习之用.有时间读者可以用逆波兰式来实现强大功能计算器,原理也很简单,建议读<c程序设计第二版>里面有算法的代码.读者自行研究.此程序基于电子相册的改进,触摸屏,LCD,字符现实,数字输入等等 mini2440  索尼X35   LCD液晶屏 主函数部分: #include "def.h" #include "option.h" #includ

如何用jsp实现一个简易计算器(三)

做这个jsp页面,主要是为了实现在同一个页面提交和接受数据的功能. 这个小程序存在很多不足,希望大家多多批评指正. <%@ page language="java" contentType="text/html;" pageEncoding="gbk"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://w

PyQt5 简易计算器

剩下计算函数(self.calculator)未实现,有兴趣的朋友可以实现它 [知识点] 1.利用循环添加按钮部件,及给每个按钮设置信号/槽 2.给按钮设置固定大小:button.setFixedSize(QtCore.QSize(60,30)) 3.取事件的的发送者(此例为各个按钮)的文本: self.sender().text() [效果图] [源代码] 1 import sys 2 from PyQt5 import QtWidgets,QtCore,QtGui 3 4 5 class E

【C++探索之旅】第一部分第五课:简易计算器

内容简介 1.第一部分第五课:简易计算器 2.第一部分第六课预告:控制流程,随心所至 简易计算器 上一课<[C++探索之旅]第一部分第四课:内存,变量和引用>中,我们已经学习了挺重要的内存的概念,变量的知识,对引用这个C++中常用的技术也有了初步的了解. 我们在上一课开头处用一个小小计算器的存储技术引出内存的概念.其实我们的电脑兄也是一个计算器,只不过高端大气上档次了很多,不然怎么会被称为 computer呢?英语中compute这个词,正是<计算>的意思,而加上r就构成了名词.c

C++实现简易计算器(正则表达式计算)

说明:简单高效的C++代码,实现简易计算器(正则表达式计算),允许小数.括号.但没有表达式正误检验功能,所以测试前请确保式子正确哦 数据结构:栈 示范输入: ((1.5+2.5)*3-4)+5 42/7-(12+3)*0.5 标准输出: the answer is 13 the answer is -1.5 源代码: #include <iostream>#include <stack> using namespace std; stack<double> number

c语言:编写一个简易计算器,打印菜单界面,实现加减乘除运算,可以退出菜单界面

.编写一个简易计算器 程序: #include<stdio.h> enum  OP { EXIT,//0 ADD,//1 SUB,//2 MUL,//3 DIV//4 }; void menu()//menu表示菜单 { printf("**** 1.add  ****\n"); printf("**** 2.sub  ****\n"); printf("**** 3.mul  ****\n"); printf("**** 

C#Windows Form简易计算器实现(中)

昨天花了一天的时间弄计算器.也算是做出来了,还是简易的(怀疑猿生!!).在此先感谢昨天被我骚扰的朋友. 先贴一张界面看看 其实健壮性还是挺差的,用户体验也是极差的.比如说用户输入了不合理运算式子,我就直接抛出一个异常完事了,因为要在原来的算法里加判断实在晕乱.所以趁热打铁,希望在写博客的时候再把思路理理,完善不足. 思路一: 因为计算的是四则混合运算,比如2*6-4/(2+3).我们最开始得到的是一个表达式字符串,计算机是不会帮你计算的.而四则混合运算有优先等级的计算,那么该怎么计算呢?于是问了