用C语言完成表达式求值问题的代码
时间: 2023-08-31 14:20:18 浏览: 107
### 回答1:
用C语言完成表达式求值问题的代码可以使用递归或者栈的数据结构来实现。首先,可以将表达式转换为逆波兰式(RPN),然后使用一个循环来遍历每一个字符,根据其类型(运算符或操作数)来执行相应的操作,最终将表达式的结果存储在栈顶元素中。
### 回答2:
要用C语言完成表达式求值问题,可以使用栈的数据结构来实现。
首先,定义栈结构的数据类型,包括栈内元素和栈顶指针。可以使用数组来表示栈的存储空间。
```c
#define MAX_SIZE 100
typedef struct {
int data[MAX_SIZE];
int top;
} Stack;
```
接下来,实现栈的初始化、入栈、出栈等基本操作。
```c
void init(Stack *s) {
s->top = -1;
}
void push(Stack *s, int value) {
s->data[++(s->top)] = value;
}
int pop(Stack *s) {
return s->data[(s->top)--];
}
int isEmpty(Stack *s) {
return (s->top == -1);
}
```
然后,实现表达式求值的函数。
```c
int evaluateExpression(char* expression) {
Stack operandStack;
Stack operatorStack;
init(&operandStack);
init(&operatorStack);
int i = 0;
while (expression[i] != '\0') {
if (expression[i] >= '0' && expression[i] <= '9') {
int num = 0;
while (expression[i] >= '0' && expression[i] <= '9') {
num = num * 10 + (expression[i] - '0');
i++;
}
push(&operandStack, num);
} else if (expression[i] == '+' || expression[i] == '-' || expression[i] == '*' || expression[i] == '/') {
while (!isEmpty(&operatorStack) && (expression[i] != '+' && expression[i] != '-') && (operatorStack.data[operatorStack.top] == '*' || operatorStack.data[operatorStack.top] == '/')) {
int operand2 = pop(&operandStack);
int operand1 = pop(&operandStack);
char op = pop(&operatorStack);
int result;
if (op == '+') {
result = operand1 + operand2;
} else if (op == '-') {
result = operand1 - operand2;
} else if (op == '*') {
result = operand1 * operand2;
} else if (op == '/') {
result = operand1 / operand2;
}
push(&operandStack, result);
}
push(&operatorStack, expression[i]);
i++;
} else {
i++;
}
}
while (!isEmpty(&operatorStack)) {
int operand2 = pop(&operandStack);
int operand1 = pop(&operandStack);
char op = pop(&operatorStack);
int result;
if (op == '+') {
result = operand1 + operand2;
} else if (op == '-') {
result = operand1 - operand2;
} else if (op == '*') {
result = operand1 * operand2;
} else if (op == '/') {
result = operand1 / operand2;
}
push(&operandStack, result);
}
return operandStack.data[operandStack.top];
}
```
最后,通过调用上述函数,传入需要求值的表达式字符串作为参数,即可得到结果。
例如:
```c
int result = evaluateExpression("5+3*2");
printf("表达式的求值结果为:%d\n", result);
```
以上就是用C语言完成表达式求值问题的代码。
### 回答3:
使用C语言完成表达式求值问题,可以通过利用栈来实现。具体步骤如下:
1. 定义一个字符数组,用来存储表达式。
2. 定义一个数字栈和一个运算符栈,用于存储数字和运算符。
3. 从左到右遍历表达式,逐个读取字符。
4. 如果当前字符是数字,则将其转换为对应的整数,并将其入栈数字栈。
5. 如果当前字符是运算符,则比较其与运算符栈栈顶元素的优先级。
a. 如果当前运算符优先级较高,则直接入栈运算符栈。
b. 如果当前运算符优先级较低或相同,则从数字栈和运算符栈弹出两个数字和一个运算符,进行运算,并将结果入栈数字栈,然后将当前运算符入栈运算符栈。
6. 重复步骤3-5,直到遍历完表达式。
7. 将数字栈和运算符栈中的剩余元素依次弹出进行运算,直到运算符栈为空,最后数字栈中的唯一元素即为表达式的结果。
以下是示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
int is_operator(char ch) {
return ch == '+' || ch == '-' || ch == '*' || ch == '/';
}
int get_priority(char op) {
if (op == '*' || op == '/')
return 2;
else if (op == '+' || op == '-')
return 1;
else
return 0;
}
int calculate(int num1, int num2, char op) {
switch (op) {
case '+':
return num1 + num2;
case '-':
return num1 - num2;
case '*':
return num1 * num2;
case '/':
return num1 / num2;
default:
return 0;
}
}
int evaluate_expression(char* expression) {
int num_stack[100];
char op_stack[100];
int num_top = -1;
int op_top = -1;
int i = 0;
while (expression[i] != '\0') {
if (isdigit(expression[i])) {
int num = 0;
while (isdigit(expression[i])) {
num = num * 10 + (expression[i] - '0');
i++;
}
num_stack[++num_top] = num;
}
else if (is_operator(expression[i])) {
while (op_top != -1 && get_priority(expression[i]) <= get_priority(op_stack[op_top])) {
int num2 = num_stack[num_top--];
int num1 = num_stack[num_top--];
char op = op_stack[op_top--];
num_stack[++num_top] = calculate(num1, num2, op);
}
op_stack[++op_top] = expression[i];
i++;
}
else {
i++;
}
}
while (op_top != -1) {
int num2 = num_stack[num_top--];
int num1 = num_stack[num_top--];
char op = op_stack[op_top--];
num_stack[++num_top] = calculate(num1, num2, op);
}
return num_stack[num_top];
}
int main() {
char expression[100];
printf("请输入表达式:");
gets(expression);
int result = evaluate_expression(expression);
printf("计算结果:%d\n", result);
return 0;
}
```
以上就是一个用C语言完成表达式求值问题的示例代码。该代码通过栈的方式来处理运算符和数字,并且利用优先级来进行运算。
阅读全文