- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目前,我正在制作一个计算器,输入数学表达式并使用RPn进行计算。因此,我使用中缀到后缀转换器函数来转换它。计算器的工作原理是将数字插入堆栈并检测运算符。但我的计算器有一个缺陷,它无法处理负数除法,例如 1/-1。是我对 RPn 的理解错误还是我的中缀到后缀函数有问题?
检测数字和运算符
int isOperator(char e){
if(e == '+' || e == '-' || e == '*' || e == '/' || e == '^')
return 1;
else
return 0;
}
int isNumber(char c) {
if ((c>='0' && c<='9') || c=='.') {
return 1;
}
return 0;
}
将数学表达式转换为后缀
void pushPostfix(struct postfixStack* s,int item){
if(s->top == (100-1)){
printf("\nSTACK FULL");
}
else{
++s->top;
s->data[s->top]=item;
}
}
char popPostfix(struct postfixStack* s){
char a=(char)-1;
if(!isEmpty(s)){
a= s->data[s->top];
--s->top;
}
return a;
}
void infixToPostfix(char* infix, char * postfix) {
char *i, *p;
struct postfixStack stack;
char n1;
emptyStack(&stack);
i = &infix[0];
p = &postfix[0];
while (*i) {
while (*i == ' ' || *i == '\t') {
i++;
}
if (isNumber(*i)) {
while (isNumber(*i)) {
*p = *i;
p++;
i++;
}
*p = ' ';
p++;
}
if (*i == '(') {
pushPostfix(&stack, *i);
i++;
}
if (*i == ')') {
n1 = popPostfix(&stack);
while (n1 != '(') {
*p = n1;
p++;
*p = ' ';
p++;
n1 = popPostfix(&stack);
}
i++;
}
if (isOperator(*i)) {
if (isEmpty(&stack)) {
pushPostfix(&stack, *i);
}
else {
n1 = popPostfix(&stack);
while (priority(n1) >= priority(*i)) {
*p = n1;
p++;
*p = ' ';
p++;
n1 = popPostfix(&stack);
}
pushPostfix(&stack, n1);
pushPostfix(&stack, *i);
}
i++;
}
}
while (!isEmpty(&stack)) {
n1 = popPostfix(&stack);
*p = n1;
p++;
*p = ' ';
p++;
}
*p = '\0';
}
最佳答案
你可以考虑这样的事情。
#define PLUS +
#define MINUS -
#define UMINUS _
#define DILIM_CLOSE 1
#define DILIM_OPEN 0
#define OPERAND 2
#define FACT !
// i is the present location being parsed in the infix string
// infix is an array holding the infix string
// this code can go to the tokeniser
// optr_type returns the type of operator, or even if it is an operand
if(infix[i]==PLUS || infix[i]==MINUS)
{
int sign=1,st=i;
while(infix[i]==PLUS || infix[i]==MINUS)
if(infix[i++]==MINUS)
sign*=-1;
if(sign==-1)
{
if((optr_type(infix[st-1])==OPERAND) ||optr_type(infix[st-1])==DILIM_CLOSE || infix[st-1]==FACT)
return MINUS;
else
return UMINUS;
}
if(sign==1)
{
if((optr_type(infix[st-1])==OPERAND) || optr_type(infix[st-1])==DILIM_CLOSE || infix[st-1]==FACT)
return PLUS;
else
return UPLUS;
}
}
当您发现在一个加号或减号之后出现了一系列减号时,请继续翻转标志。如果 sign = -1
,则用单个 -
替换负号条纹。例如 --1 = 1
和 ---1 = -1
。在 sign == -1
条件下,如果 st
中保存的前一个位置是操作数、右括号(任何类型)或阶乘符号,则它是二进制负号,否则它必须是一元负号。与一元加相同。
一旦将运算符标记为一元,就很容易评估,但您需要根据运算符的类型来决定。如果是二元,则弹出两次并应用二元运算符,如果是一元,则弹出一次并应用运算符。
关于c - RPn 处理负数除法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50517413/
赏金:对于提供代码以使此子程序与负数一起工作的任何人,+50 信誉点。 我编写了一个 MIPS 程序来将华氏温度转换为摄氏温度。它打开自己的输出窗口(即 UART)并正确显示摄氏值。它在从 C 调用到
我得到了以下代码 # On va convertir en somme monétaire # We convert our integer into a way to read money
我得到了以下代码 # On va convertir en somme monétaire # We convert our integer into a way to read money
我使用以下 RegEx 基本上过滤掉任何文本,并接受数字 + 运算符。 ([-+]?[0-9]*\.?[0-9]+[\/\+\-\*])+([-+]?[0-9]*\.?[0-9]+) 所以它抓取 1+
我有一个查询,它计算我在查询中使用 union all 的平均值,以便获取我最终使用 max 函数的数据。 当联合返回结果时,如下所示:- col 1 col2 1 0
我有这样一个类: public class SpiralGenerator implements Iterator> { private void generate(int pos, E...
A = numpy.matrix([[36, 34, 26], [18, 44, 1], [11, 31, 41]]) X1 = numpy.matrix([[462
我有一个应用程序,其中有一个显示硬币 00 的 TextView ,一个按钮显示奖励视频广告,为用户提供 10 个硬币,还有一个购买按钮,将硬币减少 30 个。现在,当用户有 30 个硬币时,单击购买
话不多少,直接附上代码实例,仅供参考 ? 1
我有一系列正数和负数,我想将每个数字的绝对值增加一个,同时仍保持正数/负数。0.2 -> 1.2-0.3 -> -1.3我怎样才能做到这一点? 最佳答案 让我们尝试使用numpysign s=pd.S
我有这段代码,只允许在 keypress() 的输入字段中输入数字 if (e.which != 8 && e.which != 0 && (e.which 57)) { return fa
我试图用“-1”作为所有值填充二维数组。我正在使用的代码是: int c [] []=new int[4][4]; Arrays.fill(c,-1) 这会引发以下错误: Exception in t
在学校作业中,我们应该编写一个程序,该程序接受一个数字并将其分为三个部分:1. 检查数字是正数还是负数2. 整数(大小)3.小数部分 要求是应该有一个自己的函数,名为separate,具有输入和输出参
有没有什么方法可以在 C# 中执行整数除法(没有 float 或小数,我需要保持这个非常快)来向下舍入数字? 默认除法只是丢弃分数参数。考虑: 1 / 2 = 0 // That is correc
我正在使用 matplotlib 为报告生成图表,并指定我自己的样式表来指定文本格式以符合报告的指定文档样式。在我的 .mplstyle 样式表中,我按如下方式指定字体系列: font.family
在 C++11 中,如果我们尝试使用全局运算符 new 分配负大小的数组,它会抛出 std::bad_array_new_length,但是 C++98/C++03 呢?是 UB 还是会抛出 std:
我试过 scanf("%u",&number) 并且我输入了负数问题是当我 printf("%d",number) 我得到负数。我认为这会阻止我读取负数。scanf("%d",&number) 和 s
我的任务是解释一些看似奇怪的C代码行为(在x86上运行)。我可以轻松完成所有其他工作,但是这确实让我感到困惑。 代码段1输出-2147483648 int a = 0x80000000; int
js有问题吗? if("hello".indexOf("world")) { // I forgot to add > -1 here console.log("hello world");
我正在尝试使用 Antlr 4 设置一个简单的计算器。 语法: grammar calcGrammar; input : expression EOF; expression : MINUS
我是一名优秀的程序员,十分优秀!