C/C++ 表达式求值的example

#include <iostream>

// 流输出操作符 <<
// 1) 针对内置类型,只是普通的操作符
// 2) 而针对自定义类型 ,涉及到重载操作符,所以应该是 操作符函数,既然是函数,就牵扯到顺序点的问题。
//    在进入operater<< 函数前,完成实参表达式的求值计算(注意:计算顺序不定)
//    (注意顺序点:执行被调函数前的最后时刻,副作用生效,将数据从寄存器copy到内存栈),
//    而后,执行函数,使用求值完成后的实际变量(或表达式返回的临时对象)的结果定义并初始化行参。
void explain()
{
   // 先计算各个操作符要结合的 操作数(或表达式返回值),
   // 然后,在使用各个操作符将 求值完成后得到的实参变量值(或表达式返回值)的结果输出,
   /*******************************************************************************
    *  例如:std::cout << i++ << i  << ++i;
    *  i++ :+1运算,然后返回i 的origin值
    *  ++i :+1运算,然后返回寄存器中运算的值 origin+1(实时),而非变量在内存中对应的值
    *  i   :取变量在内存中对应的值
    *  将得到的3个值用操作符输出
    *  另外,
    * (1)前2者的计算顺序是不确定的
    * (2)未到达下一个顺序点,副作用未必生效,所以i的取值可能是origin、origin+1 或 origin+2
    ******************************************************************************/
   int i = 4;
   std::cout << i++ << i;
   std::cout << std::endl;
   int a = 4;
   std::cout << a << a++;
   std::cout << std::endl;
/*
45
54
*/
}


int main ()
{
    int a = 1;
//    std::out << a << a++ << a << std::endl;
    std::cout << a << (a++ || 0) << a << std::endl; // 212

    explain();
    return 0;
}

C++ 中,我们可以使用栈(Stack)来实现简单的表达式求值,例如逆波兰表示法(Reverse Polish Notation,RPN)。这种方法也被称为后缀表示法,因为操作数在操作符之后。这样可以避免括号的复杂处理。 首先,我们需要定义两个栈:一个用于存储操作数,另一个用于临时存放操作符。然后遍历输入的表达式,根据遇到的字符(数字或运算符)来执行相应的操作: 1. 对于数字,直接压入操作数栈。 2. 遇到运算符时,从操作数栈弹出两个操作数,并对它们进行运算(如加减乘除),将结果压回操作数栈,同时移动运算符到临时栈。 3. 当遍历完所有字符后,如果还有运算符留在临时栈里,需要继续进行运算。 下面是一个简单的 C++ 示例代码实现: ```cpp #include <stack> #include <string> int eval(std::string tokens) { std::stack<int> numStack; std::stack<char> opStack; for (char token : tokens) { if (isdigit(token)) { int num = 0; while (isdigit(token)) { num = num * 10 + token - '0'; ++token; } numStack.push(num); } else if (token == '+' || token == '-' || token == '*' || token == '/') { while (!opStack.empty() && hasPrecedence(token, opStack.top())) { int right = numStack.top(); numStack.pop(); int left = numStack.top(); numStack.pop(); char op = opStack.top(); opStack.pop(); switch (op) { case '+': numStack.push(left + right); break; case '-': numStack.push(left - right); break; case '*': numStack.push(left * right); break; case '/': if (right != 0) numStack.push(left / right); else throw std::runtime_error("Division by zero"); break; } } opStack.push(token); } } // Handle any remaining operators while (!opStack.empty()) { int right = numStack.top(); numStack.pop(); int left = numStack.top(); numStack.pop(); char op = opStack.top(); opStack.pop(); switch (op) { case '+': numStack.push(left + right); break; case '-': numStack.push(left - right); break; case '*': numStack.push(left * right); break; case '/': numStack.push(left / right); break; } } return numStack.top(); // Return the final result } bool hasPrecedence(char op1, char op2) { if (op2 == '(' || op2 == ')') return false; // Ignore parentheses if ((op1 == '+' || op1 == '-') && (op2 == '*' || op2 == '/')) return true; return op1 > op2; } // Usage example std::string expression = "2 3 + 4 *"; int result = eval(expression); std::cout << "Result: " << result << std::endl; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值