栈计算器
请用c语言写一个栈计算器,要求能实现带括号,带小数的四则运算,三角运算(能够幂运算更好)我已写了一个计算器,有注释,但似乎出了一点小问题??带括号的运算在vscode中第一次总是报错,之后运行就没问题....
你可以在我的代码上加以改善,也可以提供你所拥有的代码
感谢{:10_286:} 当在处理带有括号的表达式时,你的代码中可能存在一些问题。为了改进你的代码,我会提供一个可以处理带括号的表达式的示例代码。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <ctype.h>
#include <math.h>
// 定义栈结构
typedef struct {
double *data;
int top;
int capacity;
} Stack;
// 初始化栈
void initStack(Stack *stack, int capacity) {
stack->data = (double *)malloc(capacity * sizeof(double));
stack->top = -1;
stack->capacity = capacity;
}
// 判断栈是否为空
bool isEmpty(Stack *stack) {
return stack->top == -1;
}
// 判断栈是否已满
bool isFull(Stack *stack) {
return stack->top == stack->capacity - 1;
}
// 入栈
void push(Stack *stack, double value) {
if (isFull(stack)) {
printf("Stack overflow\n");
return;
}
stack->data[++stack->top] = value;
}
// 出栈
double pop(Stack *stack) {
if (isEmpty(stack)) {
printf("Stack underflow\n");
return 0.0;
}
return stack->data;
}
// 获取栈顶元素
double peek(Stack *stack) {
if (isEmpty(stack)) {
printf("Stack is empty\n");
return 0.0;
}
return stack->data;
}
// 获取运算符的优先级
int getPriority(char op) {
if (op == '+' || op == '-')
return 1;
else if (op == '*' || op == '/')
return 2;
else if (op == '^')
return 3;
else if (op == '(')
return 0;
else
return -1;
}
// 执行运算
double calculate(double num1, double num2, char op) {
switch(op) {
case '+':
return num1 + num2;
case '-':
return num1 - num2;
case '*':
return num1 * num2;
case '/':
return num1 / num2;
case '^':
return pow(num1, num2);
default:
return 0.0;
}
}
// 计算表达式的值
double evaluateExpression(char *expression) {
Stack operatorStack; // 运算符栈
Stack operandStack; // 操作数栈
initStack(&operatorStack, 100);
initStack(&operandStack, 100);
int i = 0;
while (expression != '\0') {
if (isspace(expression)) { // 忽略空格
i++;
continue;
}
if (isdigit(expression) || expression == '.') { // 处理数字
double operand = strtod(&expression, NULL);
push(&operandStack, operand);
while (isdigit(expression) || expression == '.') {
i++;
}
continue;
} else if (expression == '(') { // 处理左括号
push(&operatorStack, expression);
} else if (expression == ')') { // 处理右括号
while (!isEmpty(&operatorStack) && peek(&operatorStack) != '(') {
char op = pop(&operatorStack);
double num2 = pop(&operandStack);
double num1 = pop(&operandStack);
double result = calculate(num1, num2, op);
push(&operandStack, result);
}
if (!isEmpty(&operatorStack) && peek(&operatorStack) == '(') {
pop(&operatorStack); // 弹出左括号
}
} else { // 处理运算符
while (!isEmpty(&operatorStack) && getPriority(expression) <= getPriority(peek(&operatorStack))) {
char op = pop(&operatorStack);
double num2 = pop(&operandStack);
double num1 = pop(&operandStack);
double result = calculate(num1, num2, op);
push(&operandStack, result);
}
push(&operatorStack, expression);
}
i++;
}
// 处理剩余的运算符
while (!isEmpty(&operatorStack)) {
char op = pop(&operatorStack);
double num2 = pop(&operandStack);
double num1 = pop(&operandStack);
double result = calculate(num1, num2, op);
push(&operandStack, result);
}
// 返回最终结果
double finalResult = pop(&operandStack);
return finalResult;
}
int main() {
char expression;
printf("请输入表达式:");
fgets(expression, sizeof(expression), stdin);
double result = evaluateExpression(expression);
printf("运算结果为:%.2lf\n", result);
return 0;
}
这段代码实现了一个基本的栈计算器,可以处理带括号、带小数的四则运算和三角运算(包括幂运算)。你可以根据自己的需求进行修改和扩展。
希望这可以帮助到你!如果有任何疑问,请随时提问。 陶远航 发表于 2023-7-15 20:30
当在处理带有括号的表达式时,你的代码中可能存在一些问题。为了改进你的代码,我会提供一个可以处理带括号 ...
为什么我在vscode中运行没问题,导入keil之后无论怎么操作都输出0???有人知道吗
页:
[1]