gpt4 book ai didi

c - 前缀到前缀的转换

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:21:50 26 4
gpt4 key购买 nike

我正在编写将中缀表达式转换为前缀的代码。如果输入此表达式,我的代码有问题

x*y+((z*k)-(n/m))

我得到的答案是这样的:+x*y**zk/nm
我花了很多时间在这个项目后面,但我还是不能让它工作。
正确答案是:+*xy-*zk/nm
查克的回答
# include <stdio.h>
# include <string.h>
# define MAX 20
void infixtoprefix(char infix[20], char prefix[20]);
void reverse(char array[30]);
char pop();
void push(char symbol);
int isOperator(char symbol);
int prcd(char symbol);
int top = -1;
char stack[MAX];

main() {
char infix[20], prefix[20], temp;
printf("Enter infix operation: ");
gets(infix);
infixtoprefix(infix, prefix);
reverse(prefix);
puts((prefix));
}
//--------------------------------------------------------
void infixtoprefix(char infix[20], char prefix[20]) {
int i, j = 0;
char symbol;
stack[++top] = '#';
reverse(infix);
for (i = 0; i < strlen(infix); i++) {
symbol = infix[i];
if (isOperator(symbol) == 0) {
prefix[j] = symbol;
j++;
} else {
if (symbol == ')') {
push(symbol);
} else if (symbol == '(') {
while (stack[top] != ')') {
prefix[j] = pop();
j++;
}
pop();
} else {
if (prcd(stack[top]) <= prcd(symbol)) {
push(symbol);
} else {
while (prcd(stack[top]) >= prcd(symbol)) {
prefix[j] = pop();
j++;
}
push(symbol);
}
//end for else
}
}
//end for else
}
//end for for
while (stack[top] != '#') {
prefix[j] = pop();
j++;
}
prefix[j] = '\0';
}
////--------------------------------------------------------
void reverse(char array[30]) {
// for reverse of the given expression
int i, j;
char temp[100];
for (i = strlen(array) - 1, j = 0; i + 1 != 0; --i, ++j) {
temp[j] = array[i];
}
temp[j] = '\0';
strcpy(array, temp);//copying temp array to array
// return array;
}
//--------------------------------
char pop() {
char a;
a = stack[top];
top--;
return a;
}
//----------------------------------
void push(char symbol) {
top++;
stack[top] = symbol;
}
//------------------------------------------
int prcd(char symbol) {
// returns the value that helps in the precedence
switch (symbol) {
case '+':
case '-':
return 2;
break;
case '*':
case '/':
return 4;
break;
case '$':
case '^':
return 6;
break;
case '#':
case '(':
case ')':
return 1;
break;
}
}
//-------------------------------------------------
int isOperator(char symbol) {
switch (symbol) {
case '+':
case '-':
case '*':
case '/':
case '^':
case '$':
case '&':
case '(':
case ')':
return 1;
break;
default:
return 0;
// returns 0 if the symbol is other than given above
}
}

这个密码就是答案。

最佳答案

这是因为你不知道

(character == '-') && (stack[top] == '(')

关于c - 前缀到前缀的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29348743/

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