c语言编写程序实现:通过键盘输入一个简单四则运算表达式(只包含+、-、*、/,运算符),输出计算结果。要求运用栈结构的知识。 结果样例:输入:#3+5*(3-2)# 输出:表达式3+5*(3-2)的结果为13
时间: 2024-10-14 20:08:39 浏览: 10
在C语言中,你可以使用栈数据结构来解析和计算这种简单的四则运算表达式。首先,你需要设计一个函数用于处理用户输入的每个字符,并判断其是否为数字、运算符或者结束标志。然后,利用栈的数据结构存储操作数和等待的操作符,当遇到操作符时,先从栈顶取出最近的两个操作数进行运算,接着将结果压回栈中,继续处理后续的运算符。
以下是一个基本的实现思路:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#define MAX_TOKEN_LEN 10
#define MAX_STACK_SIZE 10
typedef struct {
int val;
} Token;
int precedence(char op); // 操作符优先级函数
bool isOperator(char ch); // 判断字符是否为运算符
Token popFromStack(Stack *s); // 从栈顶弹出元素
void pushIntoStack(Token t, Stack *s); // 将元素压入栈
Stack createStack() {
Stack s = { .top = -1 };
s.array = malloc(sizeof(Token) * MAX_STACK_SIZE);
return s;
}
bool isEmpty(Stack s) {
return s.top == -1;
}
int main() {
char input[100];
scanf("%s", input);
Stack stack = createStack();
Token prev_token; // 存储上一个读取的token
bool num_mode = true; // 当前模式:数值模式
for (char *ch = input; *ch != '\0'; ch++) {
if (*ch >= '0' && *ch <= '9') { // 数字
if (num_mode) {
prev_token.val = prev_token.val * 10 + (*ch - '0');
} else {
pushIntoStack(prev_token, &stack);
num_mode = true;
prev_token.val = *ch - '0';
}
} else if (*ch == '+' || *ch == '-' || *ch == '*' || *ch == '/') { // 运算符
if (!num_mode) {
pushIntoStack(prev_token, &stack);
num_mode = true;
}
while (!isEmpty(stack) && isOperator(stack.array[stack.top]) &&
precedence(ch) <= precedence(stack.array[stack.top])) {
Token temp = popFromStack(&stack);
prev_token.val += (temp.val * (ch == '+' ? 1 : -1)); // 根据当前运算符做加减
}
pushIntoStack(prev_token, &stack);
prev_token.val = *ch - '0';
num_mode = false;
} else if (*ch == '(' || *ch == ')') { // 非法字符,忽略
} else {
printf("Invalid character: %c\n", *ch);
break;
}
}
if (!isEmpty(stack)) {
Token result = popFromStack(&stack);
printf("Expression result: %d\n", result.val);
}
free(stack.array);
return 0;
}
```
在这个示例中,`precedence()` 函数需要你自己实现,它会根据运算符的优先级返回一个整数。注意这个例子假设输入总是有效的四则运算表达式,实际应用中需要增加错误处理机制。