【C语言】—— 实现简易四则运算

2023-11-11

实现简易四则运算表达式

前言

在我们使用计算器进行简单的加减乘除运算的时候,需要注意很多问题,最重要的是乘除法的算数优先级和加减法是不同的,如果在一连串连续输入的时候,我们要如何做到正确解答问题呢?

解题思路

在面对这个问题的时候,我首先想到的方法是将数据和运算符,分别存入两个数组里,然后遍历运算符数组,将其中的乘和除筛选出来进行运算,最后再进行加减运算。

以上方法其实可以解决这个问题,但是时间复杂度过高,有点暴力的感觉,利用栈的方法就可以解决这个问题,栈的特殊处理方式,先进后出,由此我们又能想到,使用两个栈利用它特殊的处理方式来实现简单的四则运算。

第一个栈用来存储数据,将你输入的字符串中的所有的数字都存入这个栈中,方便后续的使用,另一个栈用来存储符号,需要考虑怎么才能实现先乘除后加减的特殊运算顺序,此时我们可以为其特殊的符号赋予不同的优先级,用数字来代表其优先级,越大的就越高,将我们输入的字符串中的符号一个个通过比较压入栈中,若优先级大于或等于栈顶符号那么压入栈中,若优先级小于栈顶符号,则取数字栈中两个元素,以及符号栈栈顶进行运算,并将结果存入栈中。最终数据栈的唯一一个数值就是最终的得数。

假设我们要计算1×2+3×4这个式子:
我们来模拟一下这个步骤:
在这里插入图片描述
然后第二步:
在这里插入图片描述

第三步:
在这里插入图片描述
最后一步完成加法运算即可。

全部代码如下:

#include <stdio.h>
#include <string.h>
int Calculation(int a, char c, int b);
void ScanfData();
int Compare(char ch);
int main() {
	ScanfData();
	return 0;
}

int Calculation(int a, char c, int b) {
	if (c == '+') {
		return a + b;
	} else if (c == '-') {
		return a - b;
	} else if (c == '*') {
		return a * b;
	} else if (c == '/') {
		return a / b;
	} else {
		return -1;
	}
}
void ScanfData() {
	int numStack[100] = {0};
	int numTop = -1;	
	char symStack[100] = {'='};
	int symTop = 0;	
	char str[100];
	int flag = -1;
	scanf("%s", str);
	int x = 0;
	int length = (int)strlen(str); 
	int i = 0;
	while (i < length) {
        if (str[i] >= '0' && str[i] <= '9') {
            x = x * 10 + (str[i++] - '0');
            flag = 1;
        } else {
            if (flag == 1) {
                numStack[++numTop] = x;
                x = 0;
                flag = -1;
            }
            if (Compare(symStack[symTop]) < Compare(str[i])) {
                symStack[++symTop] = str[i++];
            } else {
                int b = numStack[numTop--];
                int a = numStack[numTop--];
                numStack[++numTop] = Calculation(a, symStack[symTop], b);
                symTop--;
                if (str[i] == '=' && symTop == 0) {
                    break;
                }
            }
        }
    }
    printf("%d", numStack[numTop]);
}
int Compare(char c) {
	if (c == '=') {
		return 0;
	} else if (c == '+' || c == '-') {
		return 1;
	} else if (c == '*' || c == '/') {
		return 2;
	} else {
		printf("error");
		return -1;
	}
}

栈和队列简单练习题:

在这里插入图片描述

char* removeDuplicates(char* s) {
    int len = strlen(s);
    int i, j = 0;
    char *q = (char *)malloc(sizeof(char) * len);
    for (i = 0; i < len; i++) {
    	q[j] = s[i];
    	if (j > 0) {
    		if (q[j] == q[j - 1]) {
    			j = j - 2;
			}
		}
		j++;
	}
	q[j] = '\0';
	return q;
}

在这里插入图片描述

int countStudents(int* students, int studentsSize, int* sandwiches, int sandwichesSize){
    int stu0 = 0, stu1 = 0;
	int i;
	for (i = 0; i < studentsSize; i++) {
		if (students[i] == 0) {
			stu0++;
		} else {
			stu1++;
		}
	} 
	for (i = 0; i < sandwichesSize; i++) {
		if (sandwiches[i] == 0) {
			if (stu0 == 0) {
				return studentsSize - i;
			} else {
				stu0--;
			}
		} else {
			if (stu1 == 0) {
				return studentsSize - i;
			} else {
				stu1--;
			}
		}
	}
	return 0;
}

在这里插入图片描述

int timeRequiredToBuy(int* tickets, int ticketsSize, int k){
    int i = 0, count = 0;
    if (tickets[k] == 0) {
    	return 0;
	}
	while (i <= k) {
		for (int j = 0; j < ticketsSize; j++) {
			tickets[j]--;
			if (tickets[j] >= 0) {
				count++;
			}
			if (tickets[k] == 0) {
				return count;
			}
		}
	}
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C语言】—— 实现简易四则运算 的相关文章

  • WindowsError:[错误 126] 使用 ctypes 加载操作系统时

    python代码无法在Windows 7平台上运行 def libSO lib ctypes cdll LoadLibrary ConsoleApplication2 so lib cfoo2 1 3 当我尝试运行它时 得到来自python
  • 如何在 VC++ CString 中验证有效的整数和浮点数

    有人可以告诉我一种有效的方法来验证 CString 对象中存在的数字是有效整数还是浮点数吗 Use tcstol http msdn microsoft com en us library w4z2wdyc aspx and tcstod
  • 尝试了解使用服务打开对话框

    我已经阅读了有关使用 mvvm 模式打开对话框的讨论 我看过几个使用服务的示例 但我不明白所有部分如何组合在一起 我发布这个问题寻求指导 以了解我应该阅读哪些内容 以更好地理解我所缺少的内容 我将在下面发布我所拥有的内容 它确实有效 但从我
  • 使用 CMake 时如何导出 Emscripten 中的 C 函数

    In 本教程 https emscripten org docs porting connecting cpp and javascript Interacting with code html interacting with code
  • 有些有助于理解“产量”

    在我不断追求少吸的过程中 我试图理解 产量 的说法 但我不断遇到同样的错误 someMethod 的主体不能是迭代器块 因为 System Collections Generic List 不是迭代器接口类型 这是我被卡住的代码 forea
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • 在 C# 中,如何根据在 gridview 行中单击的按钮引用特定产品记录

    我有一个显示产品网格视图的页面 该表内有一列 其中有一个名为 详细信息 的超链接 我想这样做 以便如果用户单击该特定产品的详细信息单元格 将打开一个新页面 提供有关该产品的更多信息 我不确定如何确定哪个Product记录链接的详细信息以及我
  • 不同 C++ 文件中的相同类名

    如果两个 C 文件具有相同名称的类的不同定义 那么当它们被编译和链接时 即使没有警告也会抛出一些东西 例如 a cc class Student public std string foo return A void foo a Stude
  • 获取没有显式特征的整数模板参数的有符号/无符号变体

    我希望定义一个模板类 其模板参数始终是整数类型 该类将包含两个成员 其中之一是类型T 另一个作为类型的无符号变体T 即如果T int then T Unsigned unsigned int 我的第一直觉是这样做 template
  • 在 VS 中运行时如何查看 C# 控制台程序的输出?

    我刚刚编写了一个名为 helloworld 的聪明程序 它是一个 C NET 4 5 控制台应用程序 在扭曲的嵌套逻辑迷宫深处 使用了 Console WriteLine 当我在命令行运行它时 它会运行并且我会看到输出 我可以执行其他命令并
  • 在 .NET MAUI 中实现 TouchTracking

    我一直致力于将我们的应用程序从 Xamarin Forms 迁移到 NET MAUI 我们的应用程序几乎没有绘图功能 用户可以用手指进行绘图 我们用了TouchTrackingXamarin Forms 中的 nuget 包 但与 NET
  • 不可变类与结构

    以下是类与 C 中的结构的唯一区别 如果我错了 请纠正我 类变量是引用 而结构变量是值 因此在赋值和参数传递中复制结构的整个值 类变量是存储在堆栈上的指针 指向堆上的内存 而结构变量作为值存储在堆上 假设我有一个不可变的结构 该结构的字段一
  • 模板外部链接?谁能解释一下吗?

    模板名称具有链接 3 5 非成员函数模板可以有内部链接 任何其他模板名称应具有外部链接 从具有内部链接的模板生成的实体与在其他翻译单元中生成的所有实体不同 我知道使用关键字的外部链接 extern C EX extern C templat
  • memcpy/memmove 到联合成员,这是否设置“活动”成员?

    重要说明 一些评论者似乎认为我是从工会抄袭的 仔细看memcpy 它从普通旧地址复制uint32 t 它不包含在联合中 另外 我正在复制 通过memcpy 到工会的特定成员 u a16 or u x in a union 不直接到整个联盟本
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • C++:为什么 numeric_limits 对它不知道的类型起作用?

    我创建了自己的类型 没有任何比较器 也没有专门化std numeric limits 尽管如此 由于某种原因 std numeric limits
  • 如何在 sql azure 上运行 aspnet_regsql? [复制]

    这个问题在这里已经有答案了 可能的重复 将 ASP NET 成员资格数据库迁移到 SQL Azure https stackoverflow com questions 10140774 migrating asp net membersh
  • 当用户更改 Windows 中的语言键盘布局时如何通知?

    I want to show a message to user when the user changes the language keyboard layout of Windows for example from EN to FR

随机推荐

  • thinkphp:在解决join多表联查的时候,解决关联表默认加上前缀的问题

    问题 由上图看出正确的应该是表so lines all 而现在变为了fa so line all 故表不存在 初始代码 data db table wip jobs all gt alias a 设置wip jobs all的别名 gt j
  • vue el-form-item :rules动态校验实现

    1 form表单中
  • 【Transformer】15、PoolFormer: MetaFormer is Actually What You Need for Vision

    文章目录 一 背景和动机 二 方法 2 1 MetaFormer 2 2 PoolFormer 三 效果 四 代码 论文链接 https arxiv org pdf 2111 11418 pdf 代码链接 https github com
  • 写Python爬虫的准备工作

    写Python爬虫的准备工作 学习Python也有一段时间了 前段时间开始搞爬虫 刚开始真是头再铁也撞出血来 不过经过一段时间的摸索 总是是基本入门了 以后的路只能慢慢爬了 今天就来总结下开始爬虫之前 需要做什么准备工作 同时也是作为第一篇
  • 如何找到优秀的软件外包开发公司

    软件项目是一个复杂的系统工程 需要全面考虑 顶层设计 底层细化的方式 找公司前还是要自己懂一些技术 不懂就找一个懂技术的朋友帮着把关一下 否则很可能做不好项目 目前创业的人多 开发公司也很多 当你自己不懂的时候很难选择 北京木奇移动技术有限
  • 声音合集

    系统声音 package com ahsoft tachymeterapp utils import android media Ringtone import android media RingtoneManager import an
  • 计算机网络期末复习

    资料篇 计算机网络谢希仁版简答题题库 百度文库 习题篇 计算机网络简答题总结 百度文库 计算机网络第5章试题 百度文库 HCNE题库官网最新完整第篇传输层协议原理 附答案详解 百度文库 我又来了 想好好说一下这个复习题 you know关于
  • 哈希表(散列表)详解

    今天的每一秒都是珍贵的 因为它永远不会再次出现 作者 不能再留遗憾了 专栏 Java学习 本文章主要内容 深入理解哈希表 散列表 散列函数的几种构造方法以及解决哈希冲突的方法 文章目录 前言 什么是哈希表 哈希表相对于其他的查找结构有什么优
  • npm报错Error: ENOENT: no such file or directory, mkdir

    报错如下 解决方法 检查C Users Administrator目录下的 npmrc是否有问题 笔者的电脑上面没有F盘 删掉这一行后直接就能用了 最后 排错不易 如果问题没解决可以看这个文章 https blog csdn net kel
  • Faster R-CNN/R-FCN里mAP的计算过程(voc_eval.py解析)

    Faster R CNN R FCN在github上的python源码用mAP来度量模型的性能 mAP是各类别AP的平均 而各类别AP值是该类别precision prec 对该类别recall rec 的积分得到的 即PR曲线下面积 关于
  • C 语言使用Libcurl /curl 发送数据 (可以设置http header)

    1 环境Windows 2 依赖库文件 头文件
  • swoole-redis连接池的问题总结

    答题小程序遇到的问题 1 使用swoole的redis池爆满之后 无法调试 也不会报错 但是使用strace调试代码跟踪会出现 出现原因如下 1 代码出错 2 连接池爆满 解决方案 使用下面插件作为连接池 因为他有 一个定时关闭redis链
  • 【Teradata】windows部署安装Teradata数据库(附虚拟机扩展包)

    一 teradata 官网地址 点击此处 注 下载 需要科学上网 安装包链接 Teradata17 10版本 二 解压压缩包 注 第一个是Teradata for ODBC 第二个是Teradata虚拟机扩展包 三 安装 3 1打开VMwa
  • AlexNet imagenet classification with deep convolutional neural networks 阅读笔记

    NIPS 2012 imagenet classification with deep convolutional neural networks Paper 该网络有60 000 000个参数 650 000个神经元 包含5个卷积层 有一
  • 几分钟带你快速了解MyBatis框架理论知识!

    1 Mybatis框架是什么 mybatis是一款非常优秀的持久化框架 也是一个半ORM 对象关系映射 框架 mybatis框架它支持sql语句的定制化 存储过程和高级映射 mybatis避免了JDBC代码和手动设置参数和获取结果集 myb
  • 7个步骤让PC网站自动适配手机网页

    传统的网站如何完成向移动设备的快速转型 通过移动适配技术可以实现 切图网是国内首家基于web技术服务的公司 而移动适配主要通过底层的web技术开发手段来完成 下面切图网将从技术角度来告诉你通过7个步骤来完成一个PC网站向移动设备的跳跃 1允
  • Stereo Matching (双目)立体匹配 & 视差图 & 双目图片进行立体匹配获取深度图进行三维重建的步骤​​​​​​​

    立体匹配技术就是通过匹配两幅或者多幅图像来获得视差 disparity 图 通过立体匹配可以获得深度 进行深度估计 立体匹配算法通常由四个部分组成 包括 匹配代价计算 代价聚合 视差计算和视差优化 双目立体匹配一直是双目视觉的研究热点 双目
  • GDAL-3.3.2编译

    前言 我的环境是win10 vs2019 gdal3 3 2 编译步骤 1 GDAL下载 1 GDAL下载地址 2 GEOS Geometry Engine Open Source 下载地址 3 PROJ8下载地址 注意 1 geos官网主
  • 【Xilinx AX7103 MicroBalze学习笔记4】MicroBlaze 按键中断实验

    目录 实验任务 实验框图 硬件设计 Vivado部分 Block Design 搭建 软件设计 SDK部分 代码部分 上板验证 往期系列博客 实验任务 通过 AXI GPIO 检测按键状态产生中断信号 中断控制器检测到中断后 给处理器发送中
  • 【C语言】—— 实现简易四则运算

    实现简易四则运算表达式 前言 在我们使用计算器进行简单的加减乘除运算的时候 需要注意很多问题 最重要的是乘除法的算数优先级和加减法是不同的 如果在一连串连续输入的时候 我们要如何做到正确解答问题呢 解题思路 在面对这个问题的时候 我首先想到