利用c语言写一段代码,求给定表达式的值,3*4+(8-10/5)*2,不能直接求,利用栈
时间: 2024-10-25 11:16:19 浏览: 18
在C语言中,你可以使用栈数据结构来模拟计算过程,因为栈模拟了数学中的运算顺序规则(先乘除后加减)。这里是一个简单的示例,我们将使用递归函数以及一个临时存储结果的栈来实现这个功能:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义栈结构体
typedef struct {
int val; // 栈元素值
struct stack *next; // 指向下一个栈元素
} Stack;
// 创建一个新的栈节点
Stack *create_node(int val) {
Stack *node = (Stack*)malloc(sizeof(Stack));
node->val = val;
node->next = NULL;
return node;
}
// 初始化栈
Stack *init_stack() {
Stack *stack = NULL;
return stack;
}
// 入栈操作
Stack *push(Stack *stack, int val) {
Stack *new_node = create_node(val);
new_node->next = stack;
stack = new_node;
return stack;
}
// 出栈操作
int pop(Stack *stack) {
if (stack == NULL)
return -1;
Stack *temp = stack;
stack = stack->next;
free(temp);
return temp->val;
}
// 计算表达式值
int evaluate_expression(char* expression, Stack *stack) {
char ch;
int num1 = 0, num2 = 0, sign = 1;
for (int i = 0; expression[i] != '\0'; ++i) {
ch = expression[i];
// 处理数字
if (isdigit(ch)) {
num1 = num1 * 10 + (ch - '0');
}
// 遇到非数字字符处理
else if (ch == '+' || ch == '-') {
push(stack, sign * num1);
num1 = 0;
sign = ch == '+' ? 1 : -1;
} else if (ch == '*' || ch == '/') {
push(stack, sign * num1); // 保存当前的操作数
sign = ch; // 更新运算符
num1 = 0; // 清空数字部分
} else if (ch == '(') { // 开始新的运算
push(stack, num1);
num1 = 0;
stack = push(stack, ch);
} else if (ch == ')') { // 结束运算并计算结果
num1 += pop(stack); // 加上第一个操作数
stack = pop(stack); // 弹出运算符
while (pop(stack) != '(') {
num1 *= pop(stack); // 计算剩余的乘法
}
push(stack, num1); // 将计算后的结果压回栈
}
}
// 处理最后一个数字
if (num1 > 0)
push(stack, num1);
// 最终计算结果
return pop(stack);
}
int main() {
char expression[] = "3*4+(8-10/5)*2";
Stack *stack = init_stack();
int result = evaluate_expression(expression, stack);
printf("表达式 %s 的值是:%d\n", expression, result);
return 0;
}
```
当你运行这个程序,它会计算表达式 `3*4+(8-10/5)*2` 的值。注意这只是一个基本的示例,实际的实现可能需要考虑更多边界条件和错误处理。
阅读全文