从键盘输入一个算术表达式并输出它的结果,算术表达式可包含加、减、乘、除、十进制整数和小括号,利用栈实现。用c语言编写
时间: 2024-12-20 13:25:32 浏览: 17
在C语言中,我们可以使用栈数据结构来解析和计算简单的算术表达式。这里我们不涉及复杂的语法分析和优先级处理,而是基于基本的操作符优先级规则。以下是一个简化版的栈实现算法:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_TOKENS 100
#define MAX_STACK_SIZE 50
typedef struct {
char op; // 操作符
int num1, num2; // 两个操作数
} Token;
// 判断是否是数字字符
int is_digit(char c) {
return (c >= '0' && c <= '9');
}
// 分析并推入栈
void push_token(Stack *stack, Token token) {
if (stack->top + 1 == MAX_STACK_SIZE)
printf("Error: Stack overflow\n");
else {
stack->tokens[stack->top] = token;
stack->top++;
}
}
// 函数用于计算表达式的值
double calculate(Stack *stack) {
double num1, num2;
char op;
while (stack->top > 0) {
op = stack->tokens[stack->top - 1].op;
num2 = stack->tokens[stack->top - 2].num2;
num1 = stack->tokens[stack->top - 3].num1;
switch (op) {
case '+':
stack->tokens[stack->top - 2].num2 = num1 + num2;
break;
case '-':
stack->tokens[stack->top - 2].num2 = num1 - num2;
break;
case '*':
stack->tokens[stack->top - 2].num2 = num1 * num2;
break;
case '/':
if (num2 != 0)
stack->tokens[stack->top - 2].num2 = num1 / num2;
else
printf("Error: Division by zero\n");
break;
default:
printf("Error: Invalid operator\n");
break;
}
stack->top -= 3; // 移除最近的三个元素
}
return stack->tokens[0].num2; // 返回最终结果
}
// 主函数,接收用户输入的字符串并计算
int main() {
Stack stack;
stack.top = 0;
stack.tokens = malloc(MAX_TOKENS * sizeof(Token));
char input[MAX_TOKENS];
printf("Enter an arithmetic expression: ");
fgets(input, sizeof(input), stdin);
// 移除行尾的换行符
input[strlen(input) - 1] = '\0';
char* token = strtok(input, " ()+ -*/ "); // 使用空格、圆括号和运算符分割
while (token != NULL) {
if (is_digit(*token)) {
int num = 0;
while (is_digit(*++token))
num = num * 10 + (*token - '0');
Token t = {'.', num, 0}; // 如果第一个不是操作符,视为数值
push_token(&stack, t);
} else if (*token == '(') {
push_token(&stack, {'(', 0, 0});
} else if (*token == ')') {
while (stack.tokens[stack.top - 1].op != '(') {
double result = calculate(&stack);
Token t = {'.', 0, result};
push_token(&stack, t);
}
stack.tokens[--stack.top].op = ')'; // 提取左括号
} else {
Token t = {*token, 0, 0};
push_token(&stack, t); // 推入操作符
}
token = strtok(NULL, " ()+ -*/ "); // 获取下一个token
}
// 处理可能剩余的操作符
while (stack.top > 0) {
double result = calculate(&stack);
Token t = {'.', 0, result};
push_token(&stack, t);
}
double expr_result = calculate(&stack);
printf("The result of the expression is: %.2f\n", expr_result);
free(stack.tokens);
return 0;
}
```
**相关问题--:**
1. 这段代码如何处理括号的嵌套?
2. 如果输入的表达式超出栈的容量会发生什么?
3. 该程序能否处理分数类型的表达式?如果不能,需要如何改进?
阅读全文