下面是一个用Arduino编写的中缀转后缀的示例代码:
#include
// 定义运算符优先级
int precedence(char op) {
if (op == '+' || op == '-')
return 1;
else if (op == '*' || op == '/')
return 2;
else if (op == '^')
return 3;
else
return 0;
}
// 判断字符是运算符还是操作数
bool isOperator(char ch) {
return (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '^');
}
// 将中缀表达式转换为后缀表达式
void infixToPostfix(char* infix, char* postfix) {
StackList stack;
int i = 0;
int j = 0;
while (infix[i] != '\0') {
if (!isOperator(infix[i])) {
postfix[j++] = infix[i++];
} else {
if (stack.isEmpty() || precedence(infix[i]) > precedence(stack.peek())) {
stack.push(infix[i++]);
} else {
postfix[j++] = stack.pop();
}
}
}
while (!stack.isEmpty()) {
postfix[j++] = stack.pop();
}
postfix[j] = '\0';
}
void setup() {
Serial.begin(9600);
char infix[] = "a+b*c-d/e";
char postfix[20];
infixToPostfix(infix, postfix);
Serial.print("Infix expression: ");
Serial.println(infix);
Serial.print("Postfix expression: ");
Serial.println(postfix);
}
void loop() {}
这个示例代码使用了一个名为StackList
的自定义堆栈类。首先定义了precedence
函数来确定运算符的优先级,然后定义了isOperator
函数来判断字符是运算符还是操作数。
infixToPostfix
函数实现了中缀转后缀的算法。它使用一个堆栈来存储运算符,并遍历中缀表达式的每个字符。如果字符是操作数,直接将其添加到后缀表达式中。如果字符是运算符,将其与堆栈顶部的运算符进行比较,如果堆栈为空或者当前运算符的优先级高于堆栈顶部的运算符,则将当前运算符入栈;否则,将堆栈顶部的运算符弹出并添加到后缀表达式中。最后,将堆栈中剩余的运算符依次弹出并添加到后缀表达式中。
在setup
函数中,我们定义了一个中缀表达式"a+b*c-d/e"
,然后调用infixToPostfix
函数将其转换为后缀表达式,并打印出中缀表达式和后缀表达式。
运行以上代码,你将看到以下输出:
Infix expression: a+b*c-d/e
Postfix expression: abc*+de/-
这说明中缀表达式成功地转换为后缀表达式。