一起创业网-为互联网创业者服务

求值的程序怎么写

求值的程序可以根据不同的需求和算法来编写。以下是一个简单的C++程序,用于计算后缀表达式的值。这个程序使用了两个栈,一个用于操作数(OPND),另一个用于操作符(OPTR)。程序通过读取输入的表达式,使用栈来处理运算符的优先级,并最终计算出结果。

```cpp

include

include

include

include

using namespace std;

// 定义栈结构体

typedef stack OPTR;

typedef stack OPND;

// 定义操作符的优先级

map oper_prio = {

{'+', 1},

{'-', 1},

{'*', 2},

{'/', 2},

{'(', 0},

{')', 0}

};

// 检查字符串中有否除了0-9,之外的其他字符

int CheckString(const char *Str) {

for (int i = 0; Str[i] != '\0'; i++) {

if (!isdigit(Str[i])) {

return 0;

}

}

return 1;

}

// 将当前已经完成运算的运算符消去,同时将数值数组的位置调整以进行下一次运算

void DealString(char *OperatorArr, double *DigitalArr, int CurrPosition) {

while (CurrPosition >= 0 && CheckString(OperatorArr + CurrPosition)) {

double b = DigitalArr[CurrPosition--];

double a = DigitalArr[CurrPosition--];

char op = OperatorArr[CurrPosition--];

switch (op) {

case '+':

DigitalArr[++CurrPosition] = a + b;

break;

case '-':

DigitalArr[++CurrPosition] = a - b;

break;

case '*':

DigitalArr[++CurrPosition] = a * b;

break;

case '/':

DigitalArr[++CurrPosition] = a / b;

break;

}

}

}

// 计算后缀表达式的值

double ExpEvaluation(char *Expression) {

OPTR OPTRStack;

OPND OPNDStack;

int i = 0;

// 处理表达式中的空格

while (Expression[i] == ' ') {

i++;

}

// 将表达式中的操作数和操作符分别压入栈中

while (Expression[i] != '\0') {

if (isdigit(Expression[i])) {

double num = 0;

while (isdigit(Expression[i])) {

num = num * 10 + (Expression[i] - '0');

i++;

}

OPNDStack.push(num);

} else {

switch (Expression[i]) {

case '(':

OPTRStack.push(Expression[i]);

i++;

break;

case ')':

while (OPTRStack.top() != '(') {

DealString(Expression, OPNDStack.data(), i - 1);

}

OPTRStack.pop();

i++;

break;

default:

while (!OPTRStack.empty() && oper_prio[Expression[i]] <= oper_prio[OPTRStack.top()]) {

DealString(Expression, OPNDStack.data(), i - 1);

}

OPTRStack.push(Expression[i]);

i++;

break;

}

}

}

// 处理剩下的运算符

while (!OPTRStack.empty()) {

DealString(Expression, OPNDStack.data(), i - 1);

}

return OPNDStack.top();

}

int main() {

char expression;

cout << "请输入一个后缀表达式(例如:23*34-21+(56*(45-1))):";

cin.getline(expression, 100);

double result = ExpEvaluation(expression);

cout << "表达式的结果是:" << result << endl;

return 0;

}

```

代码解析

栈的定义

`OPTR` 和 `OPND` 分别用于存储操作符和操作数。

`oper_prio` 是一个映射,用于存储操作符的优先级。