华为面试题:四则运算 C语言源码

四则运算

描述:

请实现如下接口

/* 功能:四则运算

* 输入:strExpression:字符串格式的算术表达式,如: "3+2*{1+2*[-4/(8-6)+7]}"

* 返回:算术表达式的计算结果

*/

public static int calculate(String strExpression)

{

/* 请实现*/

return 0;

}

约束:

pucExpression字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。

pucExpression算术表达式的有效性由调用者保证;

知识点:  栈

题目来源:  内部整理

练习阶段:  中级

运行时间限制: 10Sec

内存限制: 128MByte

输入:

输入一个算术表达式

输出:

得到计算结果

样例输入:

3+2*{1+2*[-4/(8-6)+7]}

样例输出:

25

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define MAX_PATH 256
char stack_all[MAX_PATH] = {0};
char stack_symbol[MAX_PATH] = {0};
char stack_num[MAX_PATH] = {0};
int num_all=0;
int num_symbol =0;
int num_num = 0;

int cal(int a,int b,char op)
{
	switch(op)
	{
	case '+':
		return a+b;
	case '-':
		return a-b;
	case '*':
		return a*b;
	case '/':
		if (b==0)
		{
			return 0;
		}
		return a/b;
	default:
		return 0;
	}
}
//有效字符是0-9
int calculate(char *strExpression)
{

	int length = strlen(strExpression);
	for (int i=length-1;i>=0;i--)
	{
		char t = strExpression[i];
		if(t=='*' || t=='/' || t==')' || t==']' || t=='}')
		{
			stack_symbol[num_symbol] = t;
			num_symbol++;
		}
		else if (t=='(')
		{
			while(true)
			{
				if (stack_symbol[num_symbol-1]==')')
				{
					num_symbol--;
					break;
				}
				stack_all[num_all]=stack_symbol[num_symbol-1];
				num_all++;
				num_symbol--;
			}
		}
		else if (t=='[')
		{
			while(true)
			{
				if (stack_symbol[num_symbol-1]==']')
				{
					num_symbol--;
					break;
				}
				stack_all[num_all]=stack_symbol[num_symbol-1];
				num_all++;
				num_symbol--;
			}
		}
		else if (t=='{')
		{
			while(true)
			{
				if (stack_symbol[num_symbol-1]=='}')
				{
					num_symbol--;
					break;
				}
				stack_all[num_all]=stack_symbol[num_symbol-1];
				num_all++;
				num_symbol--;
			}
		}
		else if(t=='+' || t=='-')
		{
			while((stack_symbol[num_symbol-1]=='*' || stack_symbol[num_symbol-1]=='/') && num_symbol!=0 )
			{
				stack_all[num_all]=stack_symbol[num_symbol-1];
				num_all++;
				num_symbol--;
			}
			stack_symbol[num_symbol] = t;
			num_symbol++;
		}
		else
		{
			stack_all[num_all] = t;
			num_all++;
		}
	}
	for (int i=num_symbol-1;i>=0;i--)
	{
		stack_all[num_all]=stack_symbol[i];
		num_all++;
	}

	for (int i=0;i<num_all;i++)
	{
		char t = stack_all[i];
		if (t>='0'&&t<='9')
		{
			stack_num[num_num]=t-'0';
			num_num++;
		}
		else
		{
			stack_num[num_num-2] = cal(stack_num[num_num-1],stack_num[num_num-2],t);
			num_num--;
		}
	}
	return (int)stack_num[0];

} 

void init(char *buffer,char *buffer2)
{
	int length = strlen(buffer);
	int k = 0;
	for (int i=0;i<length;i++)
	{
		char t = buffer[i];
		if (t=='+'||t=='-')
		{
			if(i>=1 && (buffer[i-1]=='(' || buffer[i-1]=='[' || buffer[i-1]=='{'))
			{
				//可以不使用括号
// 				buffer2[k]='0';
// 				k++;
// 				buffer2[k]=buffer[i];
// 				k++;
				buffer2[k]='(';
				k++;
				buffer2[k]='0';
				k++;
				buffer2[k]=buffer[i];
				k++;
				buffer2[k]=buffer[i+1];
				i++;
				k++;
				buffer2[k]=')';
				k++;
			}
			else
			{
				buffer2[k]=buffer[i];
				k++;
			}
		}
		else
		{
			buffer2[k]=buffer[i];
			k++;
		}
	}
}
/*
2 3
4 6
8 10
特比注意:负数需要补0为0-正数。
*/
int main()
{
	int m=0,n=0;
	char buffer[MAX_PATH] = {0};
	gets(buffer);
//	char buffer[MAX_PATH] = "3+2*{1+2*[-4/(8-6)+7]}";
	char buffer2[MAX_PATH] = {0};
	init(buffer,buffer2);
// 	printf(buffer2);
// 	printf("\n");
	int ret = calculate(buffer2);
//	printf(stack_all);
//	printf("\n");
	printf("%d",ret);
	return 0;
}
时间: 2024-10-08 19:22:30

华为面试题:四则运算 C语言源码的相关文章

比特币挂机网赚易语言源码日赚200已上+网站+视频全套

是于易语言开发而成 在线挂机获取收益 软件内设VIP系统 提款系统 推广系统 等多功能化 如而要易语言程序源码的可以联系我QQ 382913699 注册的话需要下载软件,软件大小不到2M,下载下来后注册下,一般一天可以挖200块钱左右!提现的不是VIP一天只能提现1次,一次0.3元! VIP没有这个限制!首先我不是VIP所以不敢断言一定 所以请大家帮个忙,复制下网址访问下就可以了! 等访问量达到500一定给大家反馈下!就算是假的 一天领0.3元也好啊

Go语言源码中的Rabin-Karp算法

strings.go包实现了一个Rabin-Karp算法.有点意思. 关于这个算法: 图灵社区的有一篇: 图说Rabin-Karp字符串查找算法 关于Go源码实现: 网友GoLove已写一个篇非常详细的说明了. http://www.cnblogs.com/golove/p/3234673.html GoLove那个已经分析的非常清楚了,只是前面那一串说明太长了.我把他的说明替换成代码形式. 直接跑起来,这样更能看得清楚些. package main import ( "fmt" &q

Go语言源码中Replacer查找部份的笔记

用过strings.NewReplacer,replacer.Replace(),它按对传入参数后,能依优先级替换,并能处理中文字符串参数. 觉得功能强大,特别好用.对它的查找和优先级怎么处理有点兴趣,花时间研究了下源码,在这记录一下个人理解. package main //author:xcl //2014-1-20 记录 import ( "fmt" "strings" ) func main(){ patterns := []string{ "y&q

go语言源码赏析之strings

0.字符串为不可变类型,内部使用指针指向UTF-8字节数组 不过要修改字符串可以先将其转换成[]byte或者[]rune.如下 package main func main() { s := "abcd" bs := []byte(s) bs[1] = 'B' println(string(bs)) u := "电脑" us := []rune(u) us[1] = '话' println(string(us)) } 输出: aBcd 电话 for遍历字符串有byt

华为面试题:扑克牌大小 C语言源码

扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A.2各4张,小王1张,大王1张.牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王): 3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER 输入两手牌,两手牌之间用"-"连接,每手牌的每张牌以空格分隔,"-"两边没有空格,如:4 4 4 4-joker JOKER. 请比较两手牌大小,输出较大的牌,如果不存在比较关系则输出ERROR. 基本规则

华为面试题:识别有效的ip地址和子网掩码并分类 C语言源码

识别有效的ip地址和子网掩码并分类: 按行输入多组数据 10.8.9.2~255.0.0.0 180.8.9.2~255.254.0.0 打印:A B C D E 错误的ip或掩码 私有ip 的个数 #include "stdio.h" #include "stdlib.h" #include "string.h" #define MAX_PATH 256 int maze[10][10] = {0}; int route[100][2] = {

华为面试题:开放的书名检索库 c语言源码

开放的书名检索库 实现一个开放的书名检索库.库中存储了若干个书名.用户可以:指定搜索条件,搜索库中符合条件的书名 重要格式说明 单词 由小写英文字母组成,不含其它字符. 书名 由一个或多个单词组成. 当包含多个单词时,单词间用一个空格分隔:第一个单词前和最后一个单词后没有空格. 若只包含一个单词,则该单词前后均无空格. 搜索条件 1.由一个或多个不重复的关键字组成,每个关键字是一个单词. 2.当包含多个关键字时,关键字间用一个空格分隔:第一个关键字前和最后一个关键字后没有空格. 3.若只包含一个

华为面试题:迷宫问题 C语言源码

定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线.入口点为[0,0],既第一空格是可以走的路. Input 一个N × M的

华为2017软件精英挑战赛初赛源码

2017年三月底四月初跟实验室的小伙伴一起参加了华为的软件精英挑战赛,可惜实力不济,止步于赛区64强,还是倒数几名...... 我们使用了模拟退火+spfa最大流最小费用算法,通过上百次迭代,获取近似解. 核心代码如下: package com.cacheserverdeploy.deploy; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.H