`
leehomjan
  • 浏览: 16918 次
  • 性别: 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++中实现这些算法。这不仅有助于提高你的编程技能,还能够深化对数值计算和算法设计的理解。

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

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

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

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

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

    标题中的“人工智能四则运算手写体识别训练模型”指的是一个专门设计用于识别手写数字和四则运算符号的深度学习模型。这个模型的核心功能是处理图像数据,它能够理解和区分0到9的数字,以及加号(+)、减号(-)、...

    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++ 主要为了加资源分

Global site tag (gtag.js) - Google Analytics