计算器算法----C语言实现(堆栈法)

2023-05-16

1.字符串去空格处理

实现一:

void spacess(char *str)//删除空格
{
    int i = 0;
    int j = 0;
    while (str[i]!='\0')
    {
        str[i] = str[j];
        if (str[i]!=' ')
        {
            i++;
        }
        j++;
    }
}

实现二:

void spacess(char *str)//删除空格
{
    int i = 0;
    int j = 0;
    while ((str[i]=str[j++])!='\0')
    {
        if (str[i]!=' ')
        {
            i++;
        }
    }
}

2.提取数值包含小数

int isnum(char ch)//判断是否为数字
{
    int is = 0;//默认不是
    if (ch >= '0'&&ch <= '9')
    {
        is = 1;
    }
    return is;
}
double getnum(char *str,int *pin)//提取数字
{
    double value = 0.0;
    int index = *pin;
    while (isnum(*(str+index)))//处理整数
    {
        value = value * 10 + (str[index] - '0');
        index++;
    }
    if (*(str+index)=='.')//处理小数
    {
        double xiaoshu = 1.0;
        while (isnum(*(str + ++index)))
        {
            xiaoshu /= 10;
            value += xiaoshu*(*(str + index) -'0');
        }
    }

    *pin = index;//改变数字的位置
    return value;
}

3.实现简单的加减法

double fenxi(char *str)//加减法实现
{
    double value = 0.0;
    int index = 0;//下标地址
    value = getnum(str, &index);//获取第一个数据
    while (1)
    {
        char ch = *(str + index);//取出字符
        index++;//循环遍历
        switch (ch)
        {
        case '+':
            value += getnum(str,&index);
            break;
        case '-':
            value -= getnum(str, &index);
            break;
        case '\0':
            return value;
            break;
        default:
            break;
        }

    }

}

4.实现简单的加减乘除法

double fenxi(char *str)//乘除加减法实现
{
    double value = 0.0;
    int index = 0;//下标地址
    value = comfenxi(str, &index);//通过乘除获取第一个数据,乘除法优先级高
    while (1)
    {
        char ch = *(str + index);//取出字符
        index++;//循环遍历
        switch (ch)
        {
        case '+':
            value += comfenxi(str,&index);//判断以后的数据有没有乘除,有的话先计算
            break;
        case '-':
            value -= comfenxi(str, &index);//判断以后的数据有没有乘除,有的话先计算
            break;
        case '\0':
            return value;
            break;
        default:
            break;
        }

    }

}

double comfenxi(char *str,int *pindex)//乘除法计算
{
    double value = 0.0;//保存数据
    value = getnum(str, pindex);//获取第一个数据
    while (1)
    {
        if (*(str+(*pindex))=='*')
        {
            (*pindex)++;//下标移动
            value *= getnum(str, pindex);
        } 
        else if (*(str + (*pindex)) == '/')
        {
            (*pindex)++;//下标移动
            value /= getnum(str, pindex);
        }
        else
        {
            break;
        }
    }
    return value;
}

5.带括号的加减乘除计算
全都代码

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <locale.h>
#include <string.h>

double comfenxi(char *str, int *pindex);
double fenxi(char *str);

int isnum(char ch)//判断是否为数字
{
    int is = 0;//默认不是
    if (ch >= '0'&&ch <= '9')
    {
        is = 1;
    }
    return is;
}

char *kuohao(char *str,int *pindex)//处理括号
{
    char *pstr = NULL;
    int num = 0;//用以计算有多少括号
    int leftindex = *pindex;//记录左括号位置

    do 
    {
        switch (*(str+(*pindex)))//处理字符
        {
        case '(':
            num++;

            break;
        case ')':
            if (num==0)
            {
                (*pindex)++;//移动到括号的后面
                pstr = malloc(sizeof(char)*(*pindex-leftindex));//分配内存大小
                strncpy_s(pstr,*pindex-leftindex,str+leftindex, *pindex - leftindex-1);
            //  printf("%s\n",pstr);
                return pstr;
            } 
            else
            {
                num--;//处理右括号
            }
            break;

        }
    } while (*(str+(*pindex)++)!='\0');//判断字符结尾

}

double getnum(char *str,int *pin)//提取数字
{
    double value = 0.0;
    int index = *pin;

    while (*(str+index)=='(')//检测左括号
    {
        char *psubstr = NULL;//取出字符串
        *pin = ++index;//跳到括号后面
        psubstr = kuohao(str, pin);//获取字符串

        value = fenxi(psubstr);

    //  printf("value=%f\n", value);

    //  free(psubstr);//释放内存
        psubstr = NULL;//指针置空,防止野指针
        return value;
    }
    while (isnum(*(str+index)))//处理整数
    {
        value = value * 10 + (str[index] - '0');
        index++;
    }
    if (*(str+index)=='.')//处理小数
    {
        double xiaoshu = 1.0;
        while (isnum(*(str + ++index)))
        {
            xiaoshu /= 10;
            value += xiaoshu*(*(str + index) -'0');
        }
    }

    *pin = index;//改变数字的位置
    //printf("value=%f\n", value);
    return value;
}


void spacess(char *str)//删除空格
{
    int i = 0;
    int j = 0;
    while ((str[i]=str[j++])!='\0')
    {
        if (str[i]!=' ')
        {
            i++;
        }
    }
}

double fenxi(char *str)//乘除加减法实现
{
    double value = 0.0;
    int index = 0;//下标地址
    value = comfenxi(str, &index);//通过乘除获取第一个数据,乘除法优先级高
    while (1)
    {

    //  printf("ind=%d\n", index);
        char ch = *(str + index);//取出字符
        index++;//循环遍历
        switch (ch)
        {
        case '+':
            value += comfenxi(str,&index);//判断以后的数据有没有乘除,有的话先计算
            break;
        case '-':
            value -= comfenxi(str, &index);//判断以后的数据有没有乘除,有的话先计算
            break;
        case '\0':
            return value;
            break;
        }

    }

}

double comfenxi(char *str,int *pindex)//乘除法计算
{
    double value = 0.0;//保存数据
    //printf("pindex=%d\n",*pindex);
    value = getnum(str, pindex);//获取第一个数据
    while (1)
    {
        if (*(str+(*pindex))=='*')
        {
            (*pindex)++;//下标移动
            value *= getnum(str, pindex);
        } 
        else if (*(str + (*pindex)) == '/')
        {
            (*pindex)++;//下标移动
            value /= getnum(str, pindex);
        }
        else
        {
            break;
        }
    }
    return value;
}

void main()
{
    char str[1024] = {0};
    scanf("%[^\n]s", str);

    spacess(str);

    int in = 0;
//  double a=getnum(str, &in);
//  printf("str=%s\n", str);


    printf("in=%f\n", fenxi(str));//打印计算结果
    system("pause");
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算器算法----C语言实现(堆栈法) 的相关文章

  • APM日志格式表

    APM的日志格式文件在libraries AP Logger LogStructure h文件中 xff0c 二进制数据类型对照表如下 xff1a 单位对照表如下 xff1a
  • APM电机输出逻辑之二

    APM 飞控代码用c 43 43 编写 xff0c 代码中用了很多多态的特性 电机输出相关的函数在void Copter motors output 函数中 由于在Copter类中包含了AP MotorsMulticopter类的实例化对象
  • win11安装ubuntu子系统与桌面 填坑记录

    win11安装ubuntu子系统 win11可以直接从应用市场安装ubuntu子系统 详细安装步骤见参考资料 这里列出一些博主遇到的问题 填坑之路 从应用市场获取ubuntu系统时会报0x80240438或者0x80072efd等错误 网络
  • 机械革命电脑安装Ubuntu18.04+win10正版双系统

    一 电脑设置 系统默认安装了Win10 由于win10系统UEFI的限制 xff0c 其他系统无法加载 因此要装双系统 xff0c 必须先把UEFI模式改成Legacy模式 xff0c 并将Security Boot 改为Disabled
  • python+opencv3生成一个自定义纯色图

    一 图像在计算机中存储为矩阵 矩阵上一个点表示一个像素 若矩阵由一系列0 xff5e 255的整数值组成 xff0c 则表现为灰度图 便于理解 xff0c 以下贴出代码 import cv2 import numpy as np img 6
  • opencv+CUDA9.1+vs2015环境搭建,编译opencv库,调用GPU加速运算

    1 准备工作 xff08 需要用的软件安装 xff09 1 1安装VS2015 CUDA是以VS为基础的 xff0c 因此要先安装VS 安装CUDA的时候会自动检测VS的版本 安装步骤较简单 xff0c 下载在线安装程序之后双击即可 xff
  • px4 mavlink消息自定义及其发送

    在px4源码中自定义消息 xff0c 并发送主要有以下三个大步骤 xff1a 一 自定义mavlink消息 1 在myMessage XML文件中自定义消息 xff08 注意消息ID不要与原有的重复 xff09 具体消息ID可参考这里 2
  • px4自定义uORB消息,并实现收发

    如题 xff0c 实现以上需求 主要有三个步骤 xff1a 一 添加一个新的topic 话题 以uORB test msg为例 1 在根目录中msg文件下添加uORB test msg 并在该文件中加入所需的数据 xff08 在新版本中必须
  • 两台WIN10之间通过局域网共享文件的一些坑

    两台WIN10之间共享文件有两个步骤 准备工作 确保两台电脑在同一个局域网内 xff0c 可以用网线相连 xff0c 也可以链接到同一个路由器 步骤一 xff1a 在A电脑设置共享文件 xff08 夹 xff09 xff08 1 xff09
  • 使用Cifar10训练DenseNet121

    DenseNet默认就是DenseNet BC 相对于resnet xff0c densenet权重参数更少 xff0c 鲁棒性更强 xff10 下载数据集 xff1a Cifar 10在同级文件data下 预训练权重 xff1a 39 d
  • 四旋翼PID调试步骤

    0 将飞机固定在架子上 xff0c 只保留横滚一个自由度 1 将姿态外环参数置为0 xff0c 从姿态内环开始调 由于姿态外环参数为0 xff0c 遥控器的作用量和角度的误差无效 xff0c 飞机无法维持平衡 2 先调姿态内环P xff0c
  • Ubuntu 18.04 解决ssh连接远程服务器的问题

    具体错误为 xff1a connection closed by xx xx xx xx port 22 首先确认远程主机的IP地址是正确的 xff0c 然后进行以下操作 可能原因 1 被防火墙挡了 2 端口没开放 3 ssh服务开了没 网
  • leetcode字符串的全排列题解

    解法描述 xff1a 例如 xff0c 如果集合是 a b c 那么这个集合中元素的所有排列是 a b c a c b b a c b c a c a b c b a xff0c 显然 xff0c 给定n个元素共有n 种不同的排列 xff0
  • 线性二次调节器(LQR)

    线性二次调节器 xff08 LQR xff09 线性二次调节器 xff08 LQR xff09 LQR原理LQR中的LLQR中的QLQR中的R 线性二次调节器 xff08 LQR xff09 线性二次调节器 xff08 Linear Qua
  • 二级倒立摆建模(一)

    目录 一 倒立摆系统简介 二 二级倒立摆模型构建 三 二级倒立摆的线性化模型 四 二级倒立摆的状态空间模型 一 倒立摆系统简介 倒立摆控制系统作为实验装置在控制理论领域的教学与科研工作中担任着不可或缺的角色 在对其稳定控制研究过程中 xff
  • 无人机目标检测

    导师给了个练手项目 xff0c 记录下第一个项目过程 xff1a 项目要求 xff1a 检测无人机降落时是否偏移 xff0c 识别降落点 想法是用opencv xff0c 使用传统的轮廓检测 首先把视频流转换成图片 xff1a 只提取最后两
  • 扩展卡尔曼滤波

    扩展卡尔曼滤波 xff08 Extended Kalman Filter xff0c EKF xff09 是标准卡尔曼滤波在非线性情形下的一种扩展形式 xff0c EKF算法是将非线性函数进行泰勒展开 xff0c 省略高阶项 xff0c 保
  • 相机标定(1)内\外参矩阵和畸变矩阵

    相机标定可以说是计算机视觉 机器视觉的基础 分为以下内容 xff1a 相机标定的目的和意义相机成像过程的简化与建模针孔相机模型的数学描述标定针孔相机模型的参数 相机标定的目的和意义 我们所处的世界是三维的 xff0c 而照片是二维的 xff
  • [Python|最优状态估计与滤波学习笔记] 最小均方滤波,卡尔曼滤波,神经网络滤波

    文章目录 前言 最优状态估计与滤波1 最小均方滤波 xff08 Least Mean Square LMS xff09 基本原理LMS设计步骤仿真代码 2 线性卡尔曼滤波 xff08 Linear Kalman Filter KF xff0
  • jetson机器上对lxde桌面设置中文输入法详细过程(图文展示)

    目录 1 需求2 解决2 1 中文输入法安装包2 2 系统设置 1 需求 手上的jetson nano机器使用的是lxde桌面 xff08 通常从台湾组装的jetson机器会有带有这种图标的界面 xff0c 就是lxde界面 xff0c 和

随机推荐

  • Django密码存储策略分析

    一 源码分析 Django 发布的 1 4 版本中包含了一些安全方面的重要提升 其中一个是使用 PBKDF2 密码加密算法代替了 SHA1 另外一个特性是你可以添加自己的密码加密方法 Django 会使用你提供的第一个密码加密方法 xff0
  • 配置k8s的dashboard

    在https github com kubernetes dashboard releases查看兼容的版本 xff08 使用的k8s是v1 15 1 xff0c dashboard版本是v2 0 0 beta4 xff09 如果安装了一次
  • AirSim学习(1)-介绍,安装,unity测试

    home AirSim是一款基于虚幻引擎的无人机 汽车等模拟器 我们现在也有一个实验性的Unity版本 它是开源的 xff0c 跨平台的 xff0c 支持使用流行的飞行控制器 如PX4和ArduPilot 进行软件在环模拟 xff0c 并支
  • docker数据迁移

    docker数据迁移 前言 开发服务器随着docker运行服务的变多 xff0c docker目录占用磁盘空间也在逐渐变大 xff0c 终于在最近磁盘彻底占满导致容器启动不起来并提示 34 no device space left 34 为
  • 树莓派3B+ VNC连接,cannot currently show the desktop 问题解决

    该问题是分辨率问题 xff0c 修改分辨率就可以 以下是修改过程 备份 span class token function cp span boot config txt config txt 打开文件 span class token f
  • 金蝶K/3 跟踪语句_业务单据

    跟踪语句 业务单据 BOM select from t TableDescription where Ftablename like 39 ICBOM 39 select from t FieldDescription where FTab
  • PX4的填坑经历

    2017年3月中旬正式决定入坑PX4 xff0c 以下是期间的经历 xff08 填坑中 xff09 1 2017年4月1日 按PX4 Development Guide xff0c 在ubuntu上建立PIXHAWK的PX4固件开发环境 x
  • Git 分支管理 和 查看提交历史 标签

    git branch 创建分支 gut branch d 删除分支 git checkout 切换分支命令 git merge 合并分支 用 git add 要告诉 Git 文件冲突已经解决 git log 查看历史 git log onl
  • Android 7.0 Launcher3 去掉应用抽屉

    年初做过一个项目 xff0c 有一个需求就是需要将桌面变为单层不需要二级菜单 最近几次有小伙伴有这个问我这个解决办法 现在我将分享给大家 先上效果图 xff1a 功能分解 去除Allapp键 xff0c 调整HotSeat布局将所有应用摆在
  • C++算法库网站 https://zh.cppreference.com/w/cpp/algorithm

    貌似要出国才能访问的C 43 43 标准库api网站 https zh cppreference com w cpp algorithm 有详细的函数介绍 如下图
  • 关于cv.cvtColor转换的问题及解决方法

    问题描述篇 xff1a 今天在调试困扰了我很久的一个问题 xff0c 在训练网络生成batch数据的时候读入原始图像 xff0c 输出的时候却老是出问题 我们都知道YUV和RGB之间的转换关系 xff1a R 61 Y 43 1 4075
  • Nuttx 驱动开发手册

    目录 Nuttx 代码获取编译 Nuttx 启动流程 Nuttx BootLoader 开发之源码分析 gpio 驱动分析 I2c驱动分析 PX4 框架分析 UORB 进程间通讯分析 PX4应用层驱动分析并实现例程 串口驱动GPS 驱动分析
  • 解析小觅中通过双目相机生成深度图的代码

    最近在使用双目摄像机生成深度图 xff0c 研读一下自带的代码 xff0c 做一个记录 第一部分 xff1a 第一部分是定义了一个命名空间 xff0c 其中包含许多个类 第一个类 xff1a 1 代码 GrabCallbacks类主要用于抓
  • altium designer PCB各层介绍+添加多层+设置正/负片+设置层的网络标号

    top layer 顶层 xff0c 用来走线 bottom layer 底层 xff0c 用来走线 mechanical 机械层 xff0c 用来定义PCB形状和尺寸 keepout layer 禁止布线层 xff0c 用来绘制禁布区 t
  • java死锁产生的条件

    以下四个条件同时满足时机会产生死锁 产生死锁的条件互斥 xff0c 共享资源 X 和 Y 只能被一个线程占用 xff1b 占有且等待 xff0c 线程 T1 已经取得共享资源 X xff0c 在等待共享资源 Y 的时候 xff0c 不释放共
  • PID--位置型PID和增量式PID比较

    一 位置型PID 位置型 PID 算法适用于不带积分元件的执行器 执行器的动作位置与其输入信号呈一一对应的关系 控制器根据第 n 次计算机采样结果与给定值之间的偏差 e 来计算出第 n 次采用后所输出的控制变量的值 以调节阀来简单说明 xf
  • 你可能不知道的室内无人机秘密都在这里(二 )

    接上篇 xff1a 你可能不知道的室内无人机秘密都在这里 xff08 一 xff09 如果说上一篇是无人机现状的一些科普知识篇 xff0c 那这篇就直接上干货了 xff0c 希望能真正帮助到喜欢无人机行业 想深入研究无人机的小伙伴们 具体我
  • 漫话程序员们的家庭装修——书房篇

    身为一名程序员 xff0c 辛辛苦苦码代码N年 xff0c 终于攒下钱买了自己的小窝 xff0c 不好好犒劳一下自己都对不起自己的近视眼和鼠标手 这就来分享一下我装修的心得 xff0c 从书房开始 xff01 书房作为程序员在公司战斗一天回
  • Windows下使用vscode 调试linux kernel

    安装WSL2 在microsoft store上安装Ubuntu xff0c 当不能安装时可能需要梯子window中访问Ubuntu的目录使用 xff1a wsl Ubuntu中需要修改软件源 xff1a 参考 https mirrors
  • 计算器算法----C语言实现(堆栈法)

    1 字符串去空格处理 实现一 xff1a span class hljs keyword void span spacess span class hljs keyword char span span class hljs keyword