gpt4 book ai didi

从 Infix 转换为 Postfix 并评估 Postfix 表示法

转载 作者:行者123 更新时间:2023-11-30 20:43:27 25 4
gpt4 key购买 nike

我正在编写一个程序,它读取 Infix 表示法,将其转换为 Postfix,然后评估该 Postfix。这是我的程序:

#include<stdio.h> 
#include <ctype.h>
#define SIZE 50 /* Size of Stack */

char s[SIZE];
int top = -1; /* Global declarations */

push(char elem) { /* Function for PUSH operation */
s[++top] = elem;
}

char pop() { /* Function for POP operation */
return (s[top--]);
}

int pr(char elem) { /* Function for precedence */
switch (elem) {
case '#':
return 0;
case '(':
return 1;
case '+':
case '-':
return 2;
case '*':
case '/':
return 3;
}
}
pushit(int ele){ /* Function for PUSH operation */
s[++top]=ele;
}

int popit(){ /* Function for POP operation */
return(s[top--]);
}

main() { /* Main Program */
char infx[50], pofx[50], ch, elem;
int i = 0, k = 0, op1, op2,ele;
printf("\n\nRead the Infix Expression ");
scanf("%s", infx);
push('#');
while ((ch = infx[i++]) != '\0') {
if (ch == '(')
push(ch);
else if (isalnum(ch))
pofx[k++] = ch;
else if (ch == ')') {
while (s[top] != '(')
pofx[k++] = pop();
elem = pop(); /* Remove ( */
} else { /* Operator */
while (pr(s[top]) >= pr(ch))
pofx[k++] = pop();
push(ch);
}
}
while (s[top] != '#') /* Pop from stack till empty */
pofx[k++] = pop();
pofx[k] = '\0'; /* Make pofx as valid string */
printf("\n\nGiven Infix Expn: %s Postfix Expn: %s\n", infx, pofx);

while( (ch=pofx[i++]) != '\0')
{
if(isdigit(ch)) pushit(ch-'0'); /* Push the operand */
else
{ /* Operator,pop two operands */
op2=popit();
op1=popit();
switch(ch)
{
case '+':pushit(op1+op2);break;
case '-':pushit(op1-op2);break;
case '*':pushit(op1*op2);break;
case '/':pushit(op1/op2);break;
}
}
}
printf("\n Given Postfix Expn: %s\n",pofx);
printf("\n Result after Evaluation: %d\n",s[top]);
}

该程序正确地将我的中缀符号转换为后缀符号。但是,对于评估部分,它始终返回 0 作为结果。

另外,当从 Infix 转换为 Postfix 时,我想打印每一步的结果,我该怎么做?

最佳答案

一个问题是您将值作为字符存储在 s 中,每个元素存储 1 个字节,然后尝试使用以下方法将整数推送到 s 中:

pushit (int ele) {      /* Function for PUSH operation */
s[++top] = ele;
}

s 中混合 int/char 后,您尝试读取:

op2=popit();
op1=popit();

它尝试从popit() 创建一个intpopit() 只是一个 1 字节 char。因此 op1op2 没有获得您想要的值:

int popit(){                      /* Function for POP operation */
return(s[top--]);
}

如果您希望取回整数,则需要查看如何存储整数。最后,看看你的警告。至少,使用 -Wall 选项进行构建。它揭示了:

popit.c:8:1: warning: return type defaults to ‘int’
popit.c:32:1: warning: return type defaults to ‘int’
popit.c:41:1: warning: return type defaults to ‘int’

这可能就是您想要的。但是,您的代码应该在没有警告的情况下构建,以帮助确保它正在执行您认为它正在执行的操作。

关于从 Infix 转换为 Postfix 并评估 Postfix 表示法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24579424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com