表达式计算器

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;
}
时间: 2025-01-02 11:02:58

表达式计算器的相关文章

对象-求 后缀表达式计算器代码及设计思想 本人小白 求大神

问题描述 求 后缀表达式计算器代码及设计思想 本人小白 求大神 后缀表达式计算器 目的:后缀表达式不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则, 要求:实现一个简单的后缀表达式计算器.假定表达式里的基本数值为实数,可用的运算符包括+,-,*,/,^,其中的 ^ 表示求幂运算. ①假定输入表达式里的数和运算符之间都有空格,这样可以简化输入的处理: ②输入的算术表达式以分号为结束符.计算器应该能输入并计算一系列表达式,遇到一行的第

表达式计算器错误 CXX0017

错误消息 未找到符号无法找到表达式中指定的符号. 该错误可能的原因之一是符号名中大小写不匹配.因为 C 和 C++ 都是区分大小写的语言,所以必须完全按照源中定义的符号名大小写给定符号名. 试图在调试期间为了监视变量而转换此变量的类型时可发生该错误.typedef 声明类型的新名称,但不定义新类型.在调试器中试图进行的类型转换需要已定义类型名. 该错误与 CAN0017 相同. 通过使用下面可能的解决方案进行修复确保已在程序中将要使用该符号的地方声明了该符号. 使用实际类型名而不是 typede

4常量表达式计算器

 #include <iostream> #include <cstdlib> #include <cctype> //字符串判定   using namespace std; const int MAX = 1024; double operation(char *str); char * extract(char *str, int &index) {     char *pstr(nullptr);//处理字符串     int num(0);//记录

有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代

有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 关于

小白求解正则表达式遇到的问题

问题描述 小白求解正则表达式遇到的问题 GetShow(2f54d4f7-7431-42fe-9f7e-70e262b9ddc4,)>阳光绿色食品有限公司<>;<>详细地址:安徽岳西县中关乡<>联系电话:0556-2463256<><> 上边字段 我想要截取 阳光绿色食品有限公司 这个正则表达式该怎么写呢? 我写的正则是 ">(.+?)<>;" 获取公司名称)>阳光绿色食品有限公司<>

OpenCASCADE Expression Interpreter by Flex &amp; Bison

OpenCASCADE Expression Interpreter by Flex & Bison eryar@163.com Abstract. OpenCASCADE provide data structure of any expression, relation or function used in mathematics. Flex and Bison are tools for building programs that handle structured input. Th

Java与模式:合成模式

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 合成(Composite)模式是一种非常重要的设计模式,合成模式将对象组织到树中,用来描述树的关系.一.原理图从原理图可见,File.Folder都可以同等 看待苇IFile,为对象管理提供了极大的便利.当然,树的概念不单单是文件文件夹的层次概念,只 是因为这个很形象,实际中还有很多树的概念,比如组织机构,分类层次等等,都是逻辑上的概念,不管

Python 学习笔记之数字与字符串

Python 是解析型的语言,所以我首先需要一个 Python 解析器.我开始的时候傻乎乎地用 Ubuntu 执行了 apt-get install python, 结果它告诉我已经安装过了. 好吧,安装过就安装过了吧.开始的时候我们在交互模式 (interactive prompt) 下玩玩,方法是打开终端,输入 python 后按回车.之后,终端下就会出现提示符 >>> .一开始我们可以把它当成表达式计算器来用,当我们输入一个数学表达式后,按下回车,这个表达式将被计算,计算结果将被顶

基于表达式计算的科学计算器

同诸多网友一样,受益于VCKBASE,觉得应为他做点贡献了,于是做了这么一 个基于表达式求值的科学计算器与各位爱好编程的朋友分享. 如您所知,这方面的程序很多,看过ZF.Yi的相关作品,也见过黄江峰的相关 程序,但我觉得我的计算类有不同于二位的特色,如计算结果的有效位较长(16 位):支持不严格的表达式输入(如cos(23)*sin(34)与cos(23)*sin(34与 cos23*sin34等价):支持四种进制的数在一个表达式中同时出现的进制混合运 算(除十进制外的各进制数不限于整数,如12