(1)将只包含+、—、*、/和()的算术表达式转化为逆波兰式(后缀式);的C语言代码
时间: 2023-07-10 11:40:39 浏览: 100
以下是一个将算术表达式转化为逆波兰式的C语言实现,使用了栈来实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_EXPR_LEN 100
#define MAX_STACK_SIZE 100
char expr[MAX_EXPR_LEN];
int stack[MAX_STACK_SIZE], top = -1;
int precedence(char op) {
switch (op) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return 0;
}
}
void push(int val) {
if (top == MAX_STACK_SIZE - 1) {
printf("Error: Stack overflow\n");
exit(EXIT_FAILURE);
}
stack[++top] = val;
}
int pop() {
if (top == -1) {
printf("Error: Stack underflow\n");
exit(EXIT_FAILURE);
}
return stack[top--];
}
int main() {
printf("Enter an arithmetic expression: ");
fgets(expr, MAX_EXPR_LEN, stdin);
int i = 0, num;
while (expr[i] != '\0') {
if (isdigit(expr[i])) {
num = 0;
while (isdigit(expr[i])) {
num = num * 10 + (expr[i] - '0');
i++;
}
printf("%d ", num);
} else if (isspace(expr[i])) {
i++;
} else {
while (top >= 0 && precedence(stack[top]) >= precedence(expr[i])) {
printf("%c ", pop());
}
push(expr[i]);
i++;
}
}
while (top >= 0) {
printf("%c ", pop());
}
return 0;
}
```
该程序首先读取用户输入的算术表达式,然后按顺序扫描表达式中的每个字符。如果字符是数字,则将其转换为数字并直接输出;如果字符是操作符,则将其与栈顶的操作符比较,如果栈顶的操作符优先级大于等于当前操作符,则将栈顶的操作符弹出并输出,然后将当前操作符压入栈中。最后,将栈中剩余的操作符全部弹出并输出。输出的结果就是逆波兰式。
阅读全文