表达式计算器

简介: <p>1+2/3*(4-6)*6/8+9*2 = ?</p> <p></p> <pre code_snippet_id="572722" snippet_file_name="blog_20150105_1_4306901" name="code" class="objc">#include <stdio.h>#include <stdlib.h>#def

1+2/3*(4-6)*6/8+9*2 = ?

#include <stdio.h>
#include <stdlib.h>

#define 	MAXSIZE		32
typedef struct{
	int data[MAXSIZE];//数据段
	int top;//栈指针
}sqstack;

sqstack *sqstack_create()
{
	sqstack *sq;
	sq = malloc(sizeof(*sq));
	if(sq == NULL )
	{
		return NULL;
	}
	sq->top = -1;
	return sq;
}

int sqstack_push(sqstack *sq, int *data)//入栈
{
	if(sq->top == MAXSIZE-1)//full
	{
		return -1;
	}
	else
	{
		sq->data[++sq->top] = *data;
	}
	return 0;
}

int sqstack_top(sqstack *sq, int *data)//取得栈顶数据
{
	if(sq->top == -1)//empty
	{
		return -1;
	}
	*data = sq->data[sq->top];
	return 0;
}

int sqstack_pop(sqstack *sq, int *data)//出栈
{
	if(sq->top == -1)//empty
	{
		return -1;
	}
	*data = sq->data[sq->top--];
	return 0;
}

int compute(sqstack *snum, int ope)
{
	int n1, n2, n;
	sqstack_pop(snum, &n1);
	sqstack_pop(snum, &n2);
	switch(ope)
	{
		case '+':	n=n1+n2; printf("%d+%d=%d\n", n1, n2, n); break;
		case '-':	n=n2-n1; printf("%d-%d=%d\n", n2, n1, n);break;
		case '*':	n=n1*n2; printf("%d*%d=%d\n", n1, n2, n);break;
		case '/':	n=n2/n1; printf("%d/%d=%d\n", n2, n1, n);break;
		default:
			return -1;//break;
	}
	sqstack_push(snum, &n);//将运算结果压入数字栈
	return 0;
}

void deal_bracket(sqstack *snum, sqstack *sope)//处理括号
{
	int old_ope;
	sqstack_top(sope, &old_ope);//取得栈顶运算符
	while(old_ope != '(')
	{
		sqstack_pop(sope, &old_ope);
		compute(snum, old_ope);
		sqstack_top(sope, &old_ope);//取得栈顶运算符
	}
	sqstack_pop(sope, &old_ope);
}

int sqstack_is_empty(sqstack *sq)
{
	return (sq->top == -1);
}

int get_pri(int ope)
{
	switch(ope)
	{
		case '(':	return 0;
		case '+':
		case '-':	return 1;
		case '*':
		case '/':	return 2;
	}
}
void deal_ope(sqstack *snum, sqstack *sope, int ope)//处理运算符
{
	int old_ope;
	if(ope == '('||sqstack_is_empty(sope))
	{
		sqstack_push(sope, &ope);
		return ;
	}
	sqstack_top(sope, &old_ope);
	if(get_pri(ope) > get_pri(old_ope))
	{
		sqstack_push(sope, &ope);
		return ;
	}
	while(get_pri(ope) <= get_pri(old_ope))// * +
	{
		sqstack_pop(sope,&old_ope);
		compute(snum,old_ope);
		if(sqstack_is_empty(sope))
			break;
		sqstack_top(sope,&old_ope);
	}
	sqstack_push(sope,&ope);
}

int main()
{
	sqstack *snum;//运算数字栈
	sqstack *sope;//运算符栈
	int i = 0, value = 0, flag = 0, old_ope;
	
	char str[] = "1+3-(2*5)*(8-6)+5";//所要计算的表达式
	//初始化
	snum = sqstack_create();
	sope = sqstack_create();
	
	while(str[i] != '\0')
	{
		if(str[i] >= '0' && str[i] <= '9')//数字
		{
			value = value*10 + str[i]-'0';
			flag = 1;
		}
		else//运算符
		{
			if(flag == 1)//取得了运算的数字
			{
				sqstack_push(snum, &value);//数字入 运算数字栈
				value = 0;
				flag = 0;
			}
			if(str[i] == ')')
			{
				deal_bracket(snum,sope);
			}
			else//(+-*/
			{
				deal_ope(snum,sope,str[i]);
			}
		}
		i++;
	}
	if(flag)
	{
		sqstack_push(snum,&value);
	}
	while(!sqstack_is_empty(sope))
	{
		sqstack_pop(sope, &old_ope);
		compute(snum, old_ope);
	}
	sqstack_pop(snum, &value);
	
	printf("%s = %d\n", str, value);
	return 0;
}


目录
相关文章
|
机器学习/深度学习 人工智能 自然语言处理
提升软件测试效率与质量:AI驱动的自动化测试策略
【2月更文挑战第19天】 在快速迭代的软件发展环境中,传统的手动测试方法已无法满足高效率和高质量的要求。本文探讨了人工智能(AI)技术如何革新现有的软件测试流程,通过引入AI驱动的自动化测试策略,旨在提高测试覆盖率,减少人为错误,优化资源分配,并缩短产品上市时间。我们将分析AI在识别潜在缺陷、生成测试用例、执行测试以及结果分析中的应用,并讨论实施这些策略时可能遇到的挑战和限制。
1099 3
|
移动开发 JSON 小程序
情人节福利,恋爱话术微信小程序它来了(开源,看了就懂~,2万字真香警告)
情人节福利,恋爱话术微信小程序它来了(开源,看了就懂~,2万字真香警告)
872 0
情人节福利,恋爱话术微信小程序它来了(开源,看了就懂~,2万字真香警告)
|
11月前
|
前端开发 开发者
本文将深入探讨 BEM 的概念、原理以及其在前端开发中的应用
BEM(Block-Element-Modifier)是一种前端开发中的命名规范和架构方法,旨在提高代码的可维护性和复用性。通过将界面拆分为独立的模块,BEM 提供了一套清晰的命名规则,增强了代码的结构化和模块化设计,促进了团队协作。本文深入探讨了 BEM 的概念、原理及其在前端开发中的应用,分析了其优势与局限性,为开发者提供了宝贵的参考。
370 8
|
IDE 开发工具 图形学
Visual Basic游戏开发:进入娱乐世界的编程
【4月更文挑战第27天】本文引导初学者使用Visual Basic进行游戏开发,强调其易学性、图形支持和Windows兼容性。通过搭建开发环境、学习基础语法,从“猜数字”到“贪吃蛇”游戏实例,逐步进阶。此外,探讨了性能优化、引入游戏引擎和多媒体音效等高级技巧,鼓励开发者用VB开启游戏编程之旅,创造自己的娱乐世界。
325 0
Saga模式在处理长事务时有哪些优势和潜在的缺陷
Saga模式在处理长事务时有哪些优势和潜在的缺陷
AC/DC电源模块的工作原理基于一系列的电子组件和电路
AC/DC电源模块的工作原理基于一系列的电子组件和电路
AC/DC电源模块的工作原理基于一系列的电子组件和电路
|
机器学习/深度学习 人工智能 安全
Gandalf AI 通关详解(大模型安全)
Gandalf AI 通关详解(大模型安全)
|
存储 监控 安全
如何在iPhone设备中查看崩溃日志
如何在iPhone设备中查看崩溃日志
308 1
|
SQL 存储 分布式计算
菜鸟数据中台技术演进之路
通过中台的各技术域能力的建设,技术人员在极少的投入下,就可以支撑数倍的分析人员进行数字化运营工作。3 年时间里,菜鸟走过了从人力支撑到中台支撑的历程。
|
机器学习/深度学习 人工智能 算法
基于深度学习的农作物叶片病害检测系统(UI界面+YOLOv5+训练数据集)
基于深度学习的农作物叶片病害检测系统(UI界面+YOLOv5+训练数据集)
1082 1