#include<iostream>
#include<cstdlib>
#include<string>
#include<cmath>
using namespace std;
// 定义操作数结点
typedef struct StackNodeOPEN {
double value;
StackNodeOPEN* next;
}*OPND;
// 定义操作符节点
typedef struct OperatorNode {
char value;
OperatorNode* next;
} *Operator;
// 操作数初始化
int init1(OPND& opnd) {
opnd = NULL;
return 0;
}
// 操作符初始化
int init2(Operator& opnd) {
opnd = NULL;
return 0;
}
// 操作数入栈
int push1(OPND& opnd, double value) {
// 新增结点,栈顶上移
OPND temp = (OPND)malloc(sizeof(StackNodeOPEN));
if (!temp) {
return -1;
}
temp->value = value;
temp->next = opnd;
opnd = temp;
return 0;
}
// 操作符入栈,注意这里value的类型应该是char
int push2(Operator& opnd, char value) {
// 新增结点,栈顶上移
Operator temp = (Operator)malloc(sizeof(struct OperatorNode));
if (!temp) {
return -1;
}
temp->value = value;
temp->next = opnd;
opnd = temp;
return 0;
}
// 操作数出栈
int pop1(OPND& opnd, double& value) {
if (opnd == NULL) {
return -1; // 空栈
}
value = opnd->value; // 弹出操作数
OPND temp = opnd;
opnd = temp->next;
free(temp);
return 0;
}
// 操作符出栈
int pop2(Operator& opnd, char& value) {
if (opnd == NULL) {
return -1; // 空栈
}
value = opnd->value; // 弹出操作符
Operator temp = opnd;
opnd = temp->next;
free(temp);
return 0;
}
// 获取栈顶操作数
int getTop1(OPND& opnd, double& value) {
if (opnd == NULL) {
return -1;
}
value = opnd->value;
return 0;
}
// 获取栈顶操作符
int getTop2(Operator& opnd, char& value) {
if (opnd == NULL) {
return -1; // 栈空
}
value = opnd->value; // 获取栈顶操作符
return 0;
}
// 判断操作数栈是否为空
int isEmpty1(OPND& opnd) {
return opnd == NULL ? 1 : 0;
}
// 判断操作符栈是否为空
int isEmpty2(Operator& opnd) {
return opnd == NULL ? 1 : 0;
}
// 判断操作符优先级
int precedence(char op) {
switch (op) {
case '+': case '-': return 1;
case '*': case '/': return 2;
default: return -1; // 括号或未知操作符
}
}
// 计算两个操作数
double compute(double a, double b, char op) {
switch (op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return b != 0 ? a / b : 0; // 防止除以0
default: return 0; // 未知操作符
}
}
// 主要的表达式求值逻辑
void evaluateExpression(const string& expr, OPND& opnd, Operator& oper) {
for (int i = 0; i < expr.size(); i++) {
if (isdigit(expr[i])) {
double num = 0;
while (i < expr.size() && isdigit(expr[i])) {
num = num * 10 + (expr[i] - '0');
i++;
}
i--; // 由于循环中已经预读了下一个字符,这里需要退回一步
push1(opnd, num); // 将数字压入操作数栈
}
else if (expr[i] == '(') {
push2(oper, expr[i]); // 左括号直接压入操作符栈
}
else if (expr[i] == ')') {
char op;
while (getTop2(oper, op)&&op != '(') {
pop2(oper, op); // 弹出操作符
double a, b;
pop1(opnd, b); // 先弹出的是第二个操作数
pop1(opnd, a);
push1(opnd, compute(a, b, op)); // 计算结果并压回操作数栈
}
pop2(oper, oper->value); // 弹出左括号
}
else {
while (!isEmpty2(oper) ) {
if (oper->value == '(')
{
push2(oper, expr[i]);
break;
}
else if((precedence(oper->value) >= precedence(expr[i])))
{
double a, b;
char op;
pop2(oper, op);
pop1(opnd, b);
pop1(opnd, a);
push1(opnd, compute(a, b, op));
push2(oper, expr[i]);
}
}
//push2(oper, expr[i]); // 将当前操作符压入操作符栈
}
}
// 表达式末尾,进行剩余计算
while (!isEmpty2(oper)) {
char op;
pop2(oper, op); // 弹出操作符
double a, b;
pop1(opnd, b); // 先弹出的是第二个操作数
pop1(opnd, a);
push1(opnd, compute(a, b, op)); // 计算结果并压回操作数栈
}
}
// 主函数
int main() {
Operator oper = NULL;
OPND opnd = NULL;
cout << "Enter an expression: ";
string expr;
cin >> expr;
init1(opnd); // 初始化操作数栈
init2(oper); // 初始化操作符栈
evaluateExpression(expr, opnd, oper); // 求值
double result;
if (!isEmpty1(opnd)) {
getTop1(opnd, result); // 获取结果
cout << "The result is: " << result << endl;
}
else {
cout << "Error in expression!" << endl;
}
return 0;
}
链表栈表达式求值,请帮我在此代码的基础上进行修改,不要AI回答。
错误示例如下: