【JS】中缀表达式计算器

JavaScript的中缀表达式计算器。


最近没事做的时候就浅浅地学了一下js,和c++太神似了,只是变量无类型很不习惯。打了一个计算器来练一下手。

目前支持加、减、乘、除、乘方、括号、三角函数、自然对数,用的还是过去学的知识。。只是用js裹了一层皮,我想效率应该比c++低很多。


浮点支持比较弱,因为oi选手接触实数却是频率较小,不太会处理。

不支持高精,这是基础知识中少有的的神级难度的东西。


<html>
<script type="text/javascript">
	const level = new Array();
	level['+'] = 1;
	level['-'] = 1;
	level['*'] = 2;
	level['/'] = 2;
	level['^'] = 3;
	level['s'] = 4;
	level['c'] = 4;
	level['t'] = 4;
	level['('] = 0;
	level['l'] = 4;
	const opt = new Array();
	opt['+'] = 2;
	opt['-'] = 2;
	opt['*'] = 2;
	opt['/'] = 2;
	opt['^'] = 2;
	opt['s'] = 1;
	opt['c'] = 1;
	opt['t'] = 1;
	opt['('] = 0;
	opt['l'] = 1;

	var stack1 = new Array();
	var stack2 = new Array();
	var top1 = 0;
	var top2 = 0;

	function add(a)
	{
		if (cal.typein.value=="0")
			cal.typein.value=a;
		else
			cal.typein.value += a;
	}
	function isdigit(a)
	{
		if (a<='9' && a>='0')
			return true;
		else
			return false;
	}
	function work(a,b,c)
	{
		if (c == '+')
			return a+b;
		if (c == '-')
			return a-b;
		if (c == '*')
			return a*b;
		if (c == '/')
			return a/b;
		if (c == '^')
			return Math.pow(a,b);
		if (c == 's')
			return Math.sin(a);
		if (c == 'c')
			return Math.cos(a);
		if (c == 't')
			return Math.tan(a);
		if (c == 'l')
			return Math.log(a);
		if (c == 'n')
			return Math.ln(a);
	}
	function calc()
	{
		var str = cal.typein.value;
		str = str.replace(/sin/g,"s");
		str = str.replace(/cos/g,"c");
		str = str.replace(/tan/g,"t");
		str = str.replace(/ln/g,"l");
		str = str.replace(/pi/g,"3.141592653");
		str = str.replace(/e/g,"2.71828183");
		if (str[0] == '-')
			str = '0'+str;
		for (var i=0;i<str.length;i++)
		{
			if (isdigit(str[i]))
			{
				var j = i;
				var result=0;
				var result2=0;
				while (j<str.length+1&&isdigit(str[j]))
				{
					result = result*10+Number(str[j]);
					j ++;
				}
				if (str[j] == '.')
				{
					var bit = 0.1;
					j ++;
					while (j<str.length+1&&isdigit(str[j]))
					{
						result2 += str[j]*bit;
						bit /= 10.0;
						j ++;
					}
				}
				stack2[++top2] = result+result2;
				i = j - 1;
			}
			else if (str[i]=='(')
			{
				stack1[++top1] = '(';
			}
			else if (str[i]==')')
			{
				while (stack1[top1] != '(')
				{
					var oper = stack1[top1--];
					if (opt[oper] == 2)
					{
						var num1 = stack2[top2--];
						var num2 = stack2[top2--];
						var num = work(num2,num1,oper);
					}
					else
					{
						var num1 = stack2[top2--];
						var num = work(num1,0,oper);
					}
					stack2[++top2] = num;
				}
				top1--;
			}
			else if (top1==0 || level[str[i]] > level[stack1[top1]])
			{
				stack1[++top1] = str[i];
			}
			else
			{
				while (top1>0 && level[str[i]] <= level[stack1[top1]])
				{
					var oper = stack1[top1--];
					if (opt[oper] == 2)
					{
						var num1 = stack2[top2--];
						var num2 = stack2[top2--];
						var num = work(num2,num1,oper);
					}
					else
					{
						var num1 = stack2[top2--];
						var num = work(num1,0,oper);
					}
					stack2[++top2] = num;
				}
				stack1[++top1] = str[i];
			}
		}
		while (top1 > 0)
		{
			var oper = stack1[top1--];
			if (opt[oper] == 2)
			{
				var num1 = stack2[top2--];
				var num2 = stack2[top2--];
				var num = work(num2,num1,oper);
			}
			else
			{
				var num1 = stack2[top2--];
				var num = work(num1,0,oper);
			}
			stack2[++top2] = num;
		}
		cal.typein.value = stack2[top2];
	}
</script>

<body>
	<form name="cal">
	<table>
		<tr>
			<input type="Text" value=0 name="typein">
		<tr>
			<td><input type="Button" value="1" οnclick="add('1')"></td>
			<td><input type="Button" value="2" οnclick="add('2')"></td>
			<td><input type="Button" value="3" οnclick="add('3')"></td>
			<td><input type="Button" value="ce" οnclick="typein.value='0'"></td>
		</tr>
			<td><input type="Button" value="4" οnclick="add('4')"></td>
			<td><input type="Button" value="5" οnclick="add('5')"></td>
			<td><input type="Button" value="6" οnclick="add('6')"></td>
			<td><input type="Button" value='+' οnclick="add('+')"></td>
		<tr>
			<td><input type="Button" value="7" οnclick="add('7')"></td>
			<td><input type="Button" value="8" οnclick="add('8')"></td>
			<td><input type="Button" value="9" οnclick="add('9')"></td>
			<td><input type="Button" value="=" οnclick="calc()"></td>
		</tr>
		<tr>
			<td><input type="Button" value='-' οnclick="add('-')"></td>
			<td><input type="Button" value='*' οnclick="add('*')"></td>
			<td><input type="Button" value='/' οnclick="add('/')"></td>
			<td><input type="Button" value='^' οnclick="add('^')"></td>
		</tr>
		<tr>
			<td><input type="Button" value="sin" οnclick="add('sin')"></td>
			<td><input type="Button" value="cos" οnclick="add('cos')"></td>
			<td><input type="Button" value="tan" οnclick="add('tan')"></td>
			<td><input type="Button" value="ln" οnclick="add('ln')"></td>
		</tr>
		<tr>
			<td><input type="Button" value='(' οnclick="add('(')"></td>
			<td><input type="Button" value="pi" οnclick="add('pi')"></td>
			<td><input type="Button" value='e' οnclick="add('e')"></td>
			<td><input type="Button" value=')' οnclick="add(')')"></td>
		</tr>
	<table>
	</form>
</body>
</html>


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值