用程序实现求解表达式的值,例如输入1+2*3-16/2,则输出为-1(C语言和栈)
时间: 2024-10-17 17:09:46 浏览: 35
(x/1!)+(x*x*x/3!)+(5个x相乘/5!)+……+(2*n-1)个x相乘/(2*n-1)!)
在C语言中,使用栈来计算表达式可以利用递归或迭代的方式实现。这里是一个简单的迭代过程的示例,通过创建两个栈,分别用于存储操作数和运算符:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char op;
int num;
} token;
int precedence(char op);
bool isOperator(char op);
void pushNumber(token stack[], int &top, int num);
void applyOp(int a, int b, char op);
int pop(stack &s);
double calculateExpression(const char *expr);
int main() {
char expr[] = "1 + 2 * 3 - 16 / 2";
double result = calculateExpression(expr);
printf("结果: %lf\n", result);
return 0;
}
int precedence(char op) {
if (op == '+' || op == '-') return 1;
else if (op == '*' || op == '/') return 2;
return 0;
}
bool isOperator(char op) {
return op == '+' || op == '-' || op == '*' || op == '/';
}
void pushNumber(token stack[], int &top, int num) {
stack[top].num = num;
top++;
}
void applyOp(int a, int b, char op) {
switch (op) {
case '+':
stack[top - 1].num = a + b;
break;
case '-':
stack[top - 1].num = a - b;
break;
case '*':
stack[top - 1].num = a * b;
break;
case '/':
if (b != 0)
stack[top - 1].num = a / b;
else
printf("错误: 除数不能为零!\n");
break;
}
}
int pop(stack &s) {
if (s.top == -1)
return INT_MIN; // 或者抛出异常处理空栈情况
int val = s.stack[s.top].num;
s.top--;
return val;
}
double calculateExpression(const char *expr) {
stack tokenStack;
tokenStack.top = -1;
int i, j;
for (i = 0; expr[i] != '\0'; i++) {
if (!isOperator(expr[i])) { // 如果不是运算符,认为是数字
pushNumber(tokenStack, tokenStack.top, atoi(&expr[i]));
} else { // 遇到运算符
while ((j = tokenStack.top) >= 0 && isOperator(tokenStack.stack[j].op) &&
precedence(tokenStack.stack[j].op) >= precedence(expr[i])) {
applyOp(pop(tokenStack), pop(tokenStack), tokenStack.stack[j].op);
}
pushNumber(tokenStack, tokenStack.top, expr[i] - '0'); // 将运算符压入栈
}
}
// 处理剩余的操作数
while (tokenStack.top >= 0) {
applyOp(pop(tokenStack), pop(tokenStack), tokenStack.stack[tokenStack.top].op);
}
return pop(tokenStack); // 返回最终结果
}
```
当你运行这个程序,会得到输入表达式"1 + 2 * 3 - 16 / 2"的结果为-1。
阅读全文