`
leehomjan
  • 浏览: 16966 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

四则运算算法

阅读更多
通过输入四则运算表达是如1+2*3+4/5转换为1 2 3 * + 4 5 / +并求值。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE 100

/*符号优先级*/
int pri(char c)
{
	switch(c)
	{
		case '*':
		case '/':
			return 3;
		case '+':
		case '-':
			return 2;
		case '(':
		case ')':
			return 4;
		case '=':
			return 1;
		default:
			return -1;
	}
}

/*通过输入的算术式得到该算术式对应的后缀表达式*/
void change(char* src, char* output)
{
	int i = 0, optSiz = 0, symSTop = -1;
        /*用于存放算术符号的栈*/
	char symS[SIZE] = {'\0'};
        /*遍历算术表达式*/
	while(i < strlen(src))
	{	/* 如果是数字,不需要压入到符号栈,直接写入到输出字符串*/
		if( src[i] >= '0' && src[i] <= '9')
		{
			while(src[i] >= '0' && src[i] <= '9')
			{
				output[optSiz++] = src[i++];
			}
                        /*12+34 -> 1234+ 加上空格-> 12 34 +  */
			output[optSiz++] = ' ';
		}
                /*当遇上非右括号的符号,进行压栈和出栈*/
		if( ')' != src[i])
		{	/* + - * / and = ( */
			if( (SIZE > symSTop + 1)&& (-1 == symSTop 
				|| pri(src[i]) > pri(symS[symSTop])) )
			{	/*栈未满并且 栈空或者待处理符号的优先级大于栈顶符号的优先级 入栈*/
				symS[++symSTop] = src[i++];
			}else{
				while( -1 != symSTop && '(' != symS[symSTop]
					&& pri(src[i]) <= pri(symS[symSTop]) )
					{       /* 栈不为空 栈顶符号不为'(' 并且 待处理符号的优先级小于栈顶符号时 出栈*/
						output[optSiz++] = symS[symSTop];
						output[optSiz++] = ' ';
						symS[symSTop--] = '\0';
					}
				/* 优先级不小于当前处理符号优先级的符号全部出栈后,将当前符号入栈*/
				symS[++symSTop] = src[i++];
			}
		}
                /*遇上右括号时,进行括号的处理*/
		if( ')' == src[i] )
		{	/* 出栈,直到遇到左括号*/
			while( -1 != symSTop )
			{       /*遇到左括号,进入下一轮处理*/
				if( '(' == symS[symSTop] )
				{
					++i;
					break;
				}
                                /*非左括号,进行出栈处理*/
				output[optSiz++] = symS[symSTop];
				output[optSiz++] = ' ';
				symS[symSTop--] = '\0';
			}
			if( -1 == symSTop ) 
			{
				printf("'(' is missed!\n");
				exit(0);
			}else symS[symSTop--] = '\0';
		}
	}	
	while( -1 != symSTop )
	{	/*将剩余的符号进行出栈处理*/
		if('('== symS[symSTop]){
			printf("')' is missed!\n");
			exit(0);
		}
		output[optSiz++] = symS[symSTop];
		output[optSiz++] = ' ';
		symS[symSTop--] = '\0';
	}
}

int calculate(int m,int n, char com)
{
	switch(com)
	{
		case '+':
			return m + n;
		case '-':
			return m - n;
		case '*':
			return m * n;
		case '/':
			return m / n;
		default:	
			return -1;
	}
}

int cal(char* output)
{
	int i = 0, rslSTop = -1;
	int rslS[SIZE] = {0};
	while(i < strlen(output))
	{
		if(' ' == output[i] || '=' == output[i]){ 
			++i;
			continue;
		}else if('0' <= output[i] && '9' >= output[i])
		{
                        /*获取数据*/
			int val = 0;
			while('0' <= output[i] && '9' >= output[i])
			{
				val = 10*val + (output[i++]-'0');/*in ASCII '0' is 48 in decimal*/
			}
			rslS[++rslSTop] = val;
			continue;
		}
		else if( 1 <= rslSTop )
		{       /*遇上符号时,将栈顶两数与该符号进行四则运算,将计算结果存于栈顶的下一个位置*/
			rslS[rslSTop-1] = calculate(rslS[rslSTop-1], rslS[rslSTop], output[i++]);
                        /*是计算得到的结果成为栈顶*/
			rslS[rslSTop--] = '\0';
		}else{
			printf("error\n");
			return -1;
		}
	}
        /*获取最终的计算结果 即rslS[0]*/
	return rslS[rslSTop];
}

int main()
{
	char input[SIZE] = {'\0'};
	char output[2*SIZE] = {'\0'};
	int iptSiz = 0;
	char gc;
	while(iptSiz < SIZE-1)
	{
		gc = getchar();
		if(' ' == gc) continue;
		if('\n' == gc) break;
		input[iptSiz++] = gc;
		//if('=' == gc) break;
	}
	change(input, output);
	printf("%s\n", output);
	printf("%d\n", cal(output));
	return 0;
}
分享到:
评论

相关推荐

    四则运算算法demo

    四则运算算法是计算机科学中最基础的计算方法,它涵盖了加法、减法、乘法和除法。在编程中,实现四则运算通常涉及到解析数学表达式的过程,包括处理括号、运算符优先级等问题。这个“四则运算算法demo”显然提供了一...

    四则运算算法1.1.rar

    为此,一款名为“四则运算算法1.1”的计算程序应运而生,该版本通过引入小数点识别、正负号识别、运算式错误提示及特殊乘法等多种功能,大幅提高了计算的智能化、准确性及用户体验。 首先,小数点的正确识别对于四...

    四则运算算法.rar

    四则运算算法是计算机科学和编程领域中的基础知识,它涵盖了加法、减法、乘法和除法等基本数学操作。在本项目中,我们关注的是一个名为"四则运算算法1.0版"的实现,它具有小数点识别、正负号识别以及运算式错误提示...

    四则运算算法设计(java)

    在课余时间写的一个四则运算算法,有很多BUG,练习一下哈……

    用C++编写两个数的四则运算算法

    在这个示例中,`Caculate` 类被定义来处理两个整数的四则运算。类是面向对象编程的一个基本概念,它封装了数据和操作这些数据的方法。在本例中,`Caculate` 类包含了四个成员函数:`add`、`jian`、`cheng` 和 `chu`...

    java实现四则运算

    在本主题中,我们将深入探讨如何使用Java实现四则运算,包括中缀表达式到后缀表达式的转换以及利用栈数据结构进行计算。 首先,我们要理解四则运算的基本概念,它们包括加法(+)、减法(-)、乘法(*)和除法(/)...

    C++四则运算求值算法

    在编程领域,四则运算求值算法是计算机科学的基础,特别是在解释器和编译器设计中扮演着重要角色。本文档将重点讨论如何在C++中实现一个四则运算表达式的求值算法。C++是一种强大的面向对象的编程语言,其灵活性和...

    程序设计四则运算思想及算法

    ### 程序设计四则运算思想及算法详解 在计算机科学中,处理数学表达式,尤其是四则运算,是一项基础而重要的技能。本文旨在深入探讨四则运算的算法思想,包括基本概念、转换策略以及计算流程,通过具体示例帮助读者...

    C语言程序,仿windos自带计算器图形界面,进行四则运算,编写简单说明:C语言课程设计作品

    这个程序作为一个C语言课程设计的作品,旨在帮助学生熟悉C语言编程,理解图形界面设计,并实现基本的四则运算算法。 首先,我们需要了解C语言的基础。C语言是一种强大的、低级别的编程语言,它被广泛用于系统编程、...

    C++四则运算表达式求值算法

    四则运算表达式求值算法是计算机科学中的基础概念,它涉及到解析和计算数学中的加法、减法、乘法和除法操作。这篇文章将深入探讨如何在C++中实现一个四则运算表达式求值的算法。 首先,我们需要理解表达式的解析...

    人工智能四则运算手写体识别训练模型

    本文将深入探讨一款专门针对四则运算手写体进行识别训练的人工智能模型。 首先,我们要理解该模型的核心任务是处理图像数据,并实现对数字与运算符号的精确识别。这一过程涉及到复杂的图像处理和模式识别技术。手写...

    四则运算源代码

    四则运算在计算机科学中是基础且至关重要的概念,它涉及到加法、减法、乘法和除法。这些运算构成了大多数计算逻辑的基础,无论是在简单的计算器应用还是复杂的算法设计中,都离不开它们的身影。本资源提供的“四则...

    VBA中采用正则表达式的四则运算

    采用正则表达式的四则运算:在VBA环境中,如何使用正则表达式,将正则表达式应用到四则运算中的算是分解中。 Dim r1 As RegExp Dim m1 As Match Dim mc1 As MatchCollection Dim str As String Dim sstr As String ...

    四则运算测试程序

    四则运算测试程序是一种用于验证和测试基本数学加法、减法、乘法和除法功能的应用。在编程领域,这种程序通常被用来教授初学者基础的编程逻辑和算法设计。MFC,全称为Microsoft Foundation Classes,是微软提供的...

    栈的四则运算实现及详解

    ### 栈的四则运算实现及详解 #### 一、引言 在计算机科学中,栈是一种非常重要的数据结构,其遵循后进先出(LIFO, Last In First Out)的原则。栈通常用于解决需要“回溯”的问题,例如函数调用栈、括号匹配等问题...

    大数四则运算——双链表法

    ### 大数四则运算——双链表法 在计算机科学与编程领域中,处理大数运算是一项重要的技能。特别是当数字超出标准整型或浮点型数据类型的范围时,传统的方法将不再适用。本文将深入探讨一种特殊的大数运算实现方法...

    四则混合运算的算法

    此算法用于四则运算,没有对异常进行处理。 输入形式请如下: A+(B+C)*D= ((B+C)*D+(A+F)/E)+G/H+W= 记得输入等号,本人没有考虑回车的情况,请自行修改。 文件arithmeic主要用于将中缀表达式转为后缀表达式。 cal_...

    复数四则运算的C++算法

    数据结构课程复数四则运算实验C++ 主要为了加资源分

    c语言数据结构用栈实现四则运算

    在本项目“C语言数据结构用栈实现四则运算”中,开发者利用栈这种数据结构来处理数学中的四则运算,包括加法(+)、减法(-)、乘法(*)和除法(/)。这种方法相比传统的递归或循环方式,通常更加简洁且易于理解。...

Global site tag (gtag.js) - Google Analytics