P1902 简单算术表达式求值
时间: 2023-11-26 20:45:18 浏览: 48
P1902是一道算法题,要求实现一个简单的算术表达式求值程序。该程序可以进行加、减、乘、除基本算术运算(可以进行浮点和负数运算)和sin、cos、tan等三角函数求值运算,同时能进行指数运算和自然对数运算,还有求倒数、退格和清零功能。设计思路可以参考引用中的内容。在实现过程中,可以使用一个二维数组来定义算符之间的优先关系,具体可以参考引用中的代码。在每次进行操作时,可以使用printf函数打印该操作,具体可以参考引用中的代码。
相关问题
算术表达式求值演示 c++代码
以下是一个简单的C++代码演示算术表达式求值:\n\```++\#inclu <iostream>\#inclu <stack>\#inclu <string>\using namesp s;\n\i priority(char op) {\ if (p == '+' || op == '-') {\ retur 1;\ }\ els if (p == '*' || op == '/') {\ retur 2;\ }\ els {\ retur ;\ }\}\n\ub calcu(doub , doub b, char op) {\ switch (p) {\ cas '+':\ retur + b;\ cas '-':\ retur - b;\ cas '*':\ retur * b;\ cas '/':\ retur / b;\ defau\ retur ;\ }\}\n\ub evalu(string exp) {\ stack<doub> numStack;\ stack<char> opStack;\ for (i i = ; i < exp.length(); i++) {\ if (isdigi(exp[i])) {\ doub num = exp[i] - '';\ whi (i + 1 < exp.length() && isigi(exp[i + 1])) {\ num = num * 10 + (xp[i + 1] - '');\ i++;\ }\ numStack.push(num);\ }\ els if (xp[i] == '(') {\ opStack.push(exp[i]);\ }\ els if (xp[i] == ')') {\ whi (pStack.top() != '(') {\ char op = opStack.top();\ opStack.pop();\ doub b = numStack.top();\ numStack.pop();\ doub = numStack.top();\ numStack.pop();\ numStack.push(u(, b, op));\ }\ opStack.pop();\ }\ els if (xp[i] == '+' || exp[i] == '-' || exp[i] == '*' || exp[i] == '/') {\ whi (!pStack.empty() && priority(opStack.top()) >= priority(exp[i])) {\ char op = opStack.top();\ opStack.pop();\ doub b = numStack.top();\ numStack.pop();\ doub = numStack.top();\ numStack.pop();\ numStack.push(u(, b, op));\ }\ opStack.push(exp[i]);\ }\ }\ whi (!pStack.empty()) {\ char op = opStack.top();\ opStack.pop();\ doub b = numStack.top();\ numStack.pop();\ doub = numStack.top();\ numStack.pop();\ numStack.push(u(, b, op));\ }\ retur numStack.top();\}\n\i mai() {\ string exp = \2*(3+4)-5/2\";\ doub resu = evalu(exp);\ cou << \Th resu of \ << exp << \ is \ << resu << ;\ retur ;\}\```\n\
c语言算术表达式求值。要求运行结果显示为“请输入一个算术表达式(e退出)”用户从键盘输入一个算术表达式,数字都是十进制整型(必须支持负数),运算符支持+-*/()。 编写源程序中的 double deal_exp (char *exp) 函数,对这个算术表达式求值,返回结果。
以下是一个简单的 C 语言算术表达式求值程序,实现了对输入的算术表达式的求值,支持负数、加减乘除和括号操作。
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define STACK_SIZE 100
// 定义操作符栈结构体
typedef struct {
char op[STACK_SIZE];
int top;
} OpStack;
// 定义操作数栈结构体
typedef struct {
double val[STACK_SIZE];
int top;
} ValStack;
// 操作符栈入栈函数
void op_push(OpStack *stack, char c) {
if (stack->top >= STACK_SIZE) {
printf("Error: op stack overflow!\n");
exit(1);
}
stack->op[stack->top++] = c;
}
// 操作符栈出栈函数
char op_pop(OpStack *stack) {
if (stack->top <= 0) {
printf("Error: op stack underflow!\n");
exit(1);
}
return stack->op[--stack->top];
}
// 操作数栈入栈函数
void val_push(ValStack *stack, double val) {
if (stack->top >= STACK_SIZE) {
printf("Error: val stack overflow!\n");
exit(1);
}
stack->val[stack->top++] = val;
}
// 操作数栈出栈函数
double val_pop(ValStack *stack) {
if (stack->top <= 0) {
printf("Error: val stack underflow!\n");
exit(1);
}
return stack->val[--stack->top];
}
// 获取操作符栈顶元素函数
char op_top(OpStack *stack) {
if (stack->top <= 0) {
printf("Error: op stack underflow!\n");
exit(1);
}
return stack->op[stack->top - 1];
}
// 获取操作数栈顶元素函数
double val_top(ValStack *stack) {
if (stack->top <= 0) {
printf("Error: val stack underflow!\n");
exit(1);
}
return stack->val[stack->top - 1];
}
// 判断是否为操作符函数
int is_op(char c) {
return (c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')');
}
// 判断操作符优先级函数
int op_precedence(char c) {
switch (c) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return 0;
}
}
// 处理单个操作符函数
void deal_op(OpStack *op_stack, ValStack *val_stack) {
char op = op_pop(op_stack);
double val2 = val_pop(val_stack);
double val1 = val_pop(val_stack);
double res;
switch (op) {
case '+':
res = val1 + val2;
break;
case '-':
res = val1 - val2;
break;
case '*':
res = val1 * val2;
break;
case '/':
res = val1 / val2;
break;
default:
printf("Error: invalid operator!\n");
exit(1);
}
val_push(val_stack, res);
}
// 对算术表达式求值函数
double deal_exp(char *exp) {
OpStack op_stack = {{0}, 0};
ValStack val_stack = {{0}, 0};
char *p = exp;
while (*p) {
if (isspace(*p)) {
// 忽略空白字符
} else if (isdigit(*p) || (*p == '-' && isdigit(*(p + 1)))) {
// 处理数字
char *q = p;
while (isdigit(*q) || *q == '-') {
q++;
}
double val = atof(p);
val_push(&val_stack, val);
p = q - 1;
} else if (*p == '(') {
// 处理左括号
op_push(&op_stack, '(');
} else if (*p == ')') {
// 处理右括号
while (op_top(&op_stack) != '(') {
deal_op(&op_stack, &val_stack);
}
op_pop(&op_stack);
} else {
// 处理操作符
while (op_precedence(*p) <= op_precedence(op_top(&op_stack))) {
deal_op(&op_stack, &val_stack);
}
op_push(&op_stack, *p);
}
p++;
}
while (op_stack.top > 0) {
deal_op(&op_stack, &val_stack);
}
return val_pop(&val_stack);
}
int main() {
printf("请输入一个算术表达式(e退出)\n");
char exp[STACK_SIZE];
while (fgets(exp, STACK_SIZE, stdin)) {
if (exp[0] == 'e') {
break;
}
double res = deal_exp(exp);
printf("%.2f\n", res);
printf("请输入一个算术表达式(e退出)\n");
}
return 0;
}
```
注意,这个程序还有很多可以完善的地方,比如处理错误、增加更多的操作符等等。但是,以上代码已经可以满足题目要求。