我使用简单的堆栈算法开发了一个方程解析器,它将处理二进制(+, - ,|,&,*,/等)运算符,一元(!)运算符和括号.
但是,使用这种方法会让我拥有相同优先级的所有内容 - 无论操作符如何,都会从左到右进行评估,尽管可以使用括号强制执行优先级.
所以现在"1 + 11*5"会返回60,而不是人们所期望的56.
虽然这适用于当前项目,但我希望有一个通用例程,我可以用于以后的项目.
编辑清晰:
解析具有优先级的方程的好算法是什么?
我对一些简单的实现感兴趣,并且理解我可以自己编写代码来避免使用可用代码的许可问题.
语法:
我不明白语法问题 - 我是手写的.这很简单,我认为不需要YACC或Bison.我只需要用诸如"2 + 3*(42/13)"之类的方程计算字符串.
语言:
我在C中这样做,但我对算法感兴趣,而不是语言特定的解决方案.C足够低,如果需要,很容易转换成另一种语言.
代码示例
我发布了上面讨论的简单表达式解析器的测试代码.项目要求发生了变化,因此我从不需要优化性能或空间代码,因为它没有包含在项目中.它是原始的详细形式,应该易于理解.如果我在运算符优先级方面做了更多的事情,我可能会选择宏hack,因为它简单地匹配程序的其余部分.但是,如果我在一个真实的项目中使用它,我将寻求一个更紧凑/更快速的解析器.
相关问题
-亚当
我想知道如何在对齐环境中标记每个方程?例如
\begin{align} \label{eq:lnnonspbb}
\lambda_i + \mu_i = 0 \\
\mu_i \xi_i = 0 \\
\lambda_i [y_i( w^T x_i + b) - 1 + \xi_i] = 0
\end{align}
Run Code Online (Sandbox Code Playgroud)
只标记第一个等式,后面只能引用第一个等式.
感谢致敬!
如何仅使用一个数字在对齐环境中为几个方程编号?
例如
\begin{align}
w^T x_i + b \geqslant 1-\xi_i \text{ if } y_i=1, \nonumber \\
w^T x_i + b \leqslant -1+\xi_i \text{ if } y_i=-1,
\end{align}
Run Code Online (Sandbox Code Playgroud)
编号将出现在第二个等式旁边.但如果它出现在两个方程的线之间会更好.
在这种情况下如何标记这组方程以供以后参考?
感谢致敬!
我如何(轻松地)获取一个字符串,例如"sin(x)*x^2"
用户可能在运行时输入的字符串,并生成一个可以评估任何值的Python函数x
?
我想在Matplotlib中绘制隐式方程(形式为f(x,y)= g(x,y),例如X ^ y = y ^ x).这可能吗?
如何使用MS Word中提供的Microsoft Equation 3.0将实数的R符号插入等式中?我的意思是这个双重打击的首都ℝ.
我很努力并且已经尝试过:
- 复制并粘贴
- 将ASCII十六进制代码211D转换为希望的符号
- 使用特殊字体作为Cambria Math和其他人
所有这些选项在运行文本中完美地起作用,但在公式中不起作用!
让我的一天,并告诉我,这是可能的(必须在MS方程式).谢谢.
我有一个等式,如下:
R - ((1.0 - np.exp(-tau))/(1.0 - np.exp(-a*tau))) = 0
.
我想tau
用numpy中可用的数值解算器在这个等式中求解.最好的方法是什么?
对于该公式的不同实现,该等式中的值R
和a
该等式的值不同,但是当要针对tau求解时,将其固定在特定值.
我想在一个新的行中添加一个等式.问题是该等式对于该行来说太长了,我需要手动打破它.否则,它只是重叠到右列,或右边距(看起来很丑......).LaTeX有没有办法为我制造方程式,所以看起来不错?
我附上我的乳胶代码:
\begin{align*}
f(n)-f(0) &= A(n)-B(n)-C(n)-D(n)\cdot d-\left(A(0)-B(0)-C(0)-D(0)\cdot d\right) \\
&= A(n)-0-X-D(n)\cdot d-\left(0-0-0-0\right) \\
&= A(n)-X-D(n)\cdot d
\end{align*}
Run Code Online (Sandbox Code Playgroud)
有问题的线是第一条线,太长了.