编写算符优先分析算法的程序,语言是c语言
时间: 2024-05-04 11:21:32 浏览: 90
编译原理实验二——算符优先分析法设计与实现
以下是一个简单的算符优先分析算法的C语言程序示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STACK_SIZE 100 // 定义栈的最大大小
char op_stack[MAX_STACK_SIZE]; // 运算符栈
int val_stack[MAX_STACK_SIZE]; // 操作数栈
int op_top = -1; // 运算符栈顶指针
int val_top = -1; // 操作数栈顶指针
// 判断某个字符是否为运算符
int is_operator(char ch) {
return ch == '+' || ch == '-' || ch == '*' || ch == '/';
}
// 获取运算符的优先级
int get_priority(char op) {
switch (op) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return 0;
}
}
// 从运算符栈和操作数栈中弹出两个数进行计算,并将结果压入操作数栈中
void calculate() {
int a = val_stack[val_top--];
int b = val_stack[val_top--];
char op = op_stack[op_top--];
int result;
switch (op) {
case '+':
result = b + a;
break;
case '-':
result = b - a;
break;
case '*':
result = b * a;
break;
case '/':
result = b / a;
break;
default:
break;
}
val_stack[++val_top] = result;
}
// 将字符类型的操作数转换成整型
int char_to_int(char ch) {
return ch - '0';
}
int main() {
char input[MAX_STACK_SIZE]; // 存储输入的算式
printf("请输入算式:");
scanf("%s", input);
int len = strlen(input);
// 逐个扫描输入的算式
for (int i = 0; i < len; i++) {
char ch = input[i];
if (is_operator(ch)) { // 如果是运算符
if (op_top == -1 || get_priority(ch) > get_priority(op_stack[op_top])) {
op_stack[++op_top] = ch; // 直接将运算符压入栈中
} else {
while (op_top != -1 && get_priority(ch) <= get_priority(op_stack[op_top])) {
calculate(); // 弹出两个操作数和一个运算符进行计算
}
op_stack[++op_top] = ch; // 将当前运算符压入栈中
}
} else { // 如果是操作数
int val = char_to_int(ch);
while (i+1 < len && !is_operator(input[i+1])) { // 如果下一个字符也是操作数,则将其合并成一个多位数
val = val*10 + char_to_int(input[++i]);
}
val_stack[++val_top] = val; // 将操作数压入栈中
}
}
// 处理剩余的运算符
while (op_top != -1) {
calculate();
}
printf("计算结果:%d\n", val_stack[0]); // 最终的结果就是操作数栈中唯一的元素
return 0;
}
```
使用示例:
```
请输入算式:3+4*5-6/2
计算结果:20
```
阅读全文