1397:简单算术表达式求值(C C++)

【题目描述】两位正整数的简单算术运算(只考虑整数运算),算术运算为:+,加法运算;-,减法运算;*,乘法运算;/,整除运算;%,取余运算。算术表达式的格式为(运算符前后可能有空格):运算数 运算符 运算数请输出相应的结果。【输入】一行算术表达式。【输出】整型算数运算的结果(结果值不一定为2位数,可能多于2位或少于2位)。【输入样例】32+64【输出样例】96【代码】...
摘要由CSDN通过智能技术生成

【题目描述】

两位正整数的简单算术运算(只考虑整数运算),算术运算为:

+,加法运算;

-,减法运算;

*,乘法运算;

/,整除运算;

%,取余运算。

算术表达式的格式为(运算符前后可能有空格):

运算数 运算符 运算数

请输出相应的结果。

【输入】

一行算术表达式。

【输出】

整型算数运算的结果(结果值不一定为2位数,可能多于2位或少于2位)。

【输入样例】

32+64

【输出样例】

96

【代码】

#include<iostream>
using 
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
算术表达式是指将一个数学表达式计算出结果的过程,比如输入字符串"3+4*2-1",我们需要计算出它的结果9。算术表达式的代码可以分为两个部分:中缀表达式转后缀表达式和后缀表达式。 中缀表达式转后缀表达式的过程可以使用栈来实现。具体步骤如下: 1. 初始化一个操作符栈和一个输出队列。 2. 从左到右扫描中缀表达式,如果是数字,直接输出到队列中。 3. 如果是操作符,判断其与操作符栈栈顶元素的优先级,如果优先级低于或等于栈顶元素,则弹出栈顶元素并输出到队列中,重复此步骤直到优先级高于栈顶元素或栈为空,然后将该操作符入栈。 4. 如果是左括号"(",则直接入栈。 5. 如果是右括号")",则依次弹出栈顶元素并输出到队列中,直到遇到左括号为止,左右括号均不输出。 6. 重复步骤2至5直到扫描完毕,将栈中剩余的操作符依次弹出并输出到队列中。 得到后缀表达式后,可以使用栈来进行后缀表达式。具体步骤如下: 1. 初始化一个操作数栈。 2. 从左到右扫描后缀表达式,如果是数字,将其入栈。 3. 如果是操作符,则从操作数栈中弹出两个元素进行计算,并将计算结果入栈。 4. 重复步骤2至3直到扫描完毕,此时操作数栈中只剩下一个元素,即为最终结果。 以下是一个简单的C++代码示例: ```c++ #include <iostream> #include <stack> #include <queue> #include <string> using namespace std; int priority(char c) { if (c == '+' || c == '-') return 1; if (c == '*' || c == '/') return 2; return 0; } queue<string> infixToSuffix(string infix) { stack<char> opStack; queue<string> suffix; int i = 0; while (i < infix.length()) { if (isdigit(infix[i])) { string numStr; while (i < infix.length() && isdigit(infix[i])) { numStr += infix[i]; i++; } suffix.push(numStr); } else if (infix[i] == '+' || infix[i] == '-' || infix[i] == '*' || infix[i] == '/') { while (!opStack.empty() && priority(opStack.top()) >= priority(infix[i])) { suffix.push(string(1, opStack.top())); opStack.pop(); } opStack.push(infix[i]); i++; } else if (infix[i] == '(') { opStack.push(infix[i]); i++; } else if (infix[i] == ')') { while (opStack.top() != '(') { suffix.push(string(1, opStack.top())); opStack.pop(); } opStack.pop(); i++; } else { i++; } } while (!opStack.empty()) { suffix.push(string(1, opStack.top())); opStack.pop(); } return suffix; } double evaluateSuffix(queue<string> suffix) { stack<double> numStack; while (!suffix.empty()) { string s = suffix.front(); suffix.pop(); if (isdigit(s)) { numStack.push(stod(s)); } else { double num2 = numStack.top(); numStack.pop(); double num1 = numStack.top(); numStack.pop(); if (s == '+') numStack.push(num1 + num2); else if (s == '-') numStack.push(num1 - num2); else if (s == '*') numStack.push(num1 * num2); else if (s == '/') numStack.push(num1 / num2); } } return numStack.top(); } int main() { string infix = "3+4*2-1"; queue<string> suffix = infixToSuffix(infix); double result = evaluateSuffix(suffix); cout << result << endl; return 0; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值