MT3035 逆波兰式

2024-05-16 05:28
文章标签 波兰 mt3035

本文主要是介绍MT3035 逆波兰式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 思路:

两个栈str1和sr2,分别存放运算符和结果。

如果是数字,直接放入str2中。

如果是运算符:

1. ( :直接放入   str1

2. +/-/*// 看栈顶元素,若当前字符优先级比栈顶大,则压到str1中;否则str1中元素出栈压到str2中直到当前字符优先级比栈顶大,再把当前字符压到str1中。

3. ) :str1元素依次出栈压到str2中,直到碰见( 。  

例子:8-(3+2*6)/5+4

str1:                                             str2: 8           

str1:-                                            str2: 8           

str1:-  (                                         str2: 8   

str1:-  (                                         str2: 8 3   

str1:-  ( +                                      str2: 8 3   

str1:-  ( +                                      str2: 8 3 2 

str1:-  ( +  *                                   str2: 8 3 2 

str1:-  ( +  *                                   str2: 8 3 2 6

此时遇见):

str1:-                                             str2: 8 3 2 6 * +

str1:-  /                                          str2: 8 3 2 6 * +

str1:-  /                                          str2: 8 3 2 6 * + 5

此时遇见+,因为str1栈顶为/,所以要把/放到str2;str1栈顶此时为-,因为+不比-优先级高,所以-也放入str2中:

str1: +                                        str2: 8 3 2 6 * + 5  / -

str1: +                                        str2: 8 3 2 6 * + 5  / - 4

最后把str1中元素依次压到str2中:

str1:                                          str2: 8 3 2 6 * + 5  / - 4 +

所以最后str2中元素逆序出栈即为逆波兰式。

代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e6 + 10;
bool is_op(char c)
{return c == '+' || c == '-' || c == '*' || c == '/';
}
int prority(char op)
{if (op == '+' || op == '-')return 1;if (op == '*' || op == '/')return 2;return -1;
}
void process_op(string s)
{ // 后缀表达式的求值stack<int> st;bool change = false; // 记录是否需要打印for (int i = 0; i < s.length(); i++){if (is_op(s[i])){int r = st.top();st.pop();int l = st.top();st.pop();switch (s[i]){case '+':st.push(l + r);break;case '-':st.push(l - r);break;case '*':st.push(l * r);break;case '/':st.push(l / r);break;}change = true; // 计算,需要打印}else{st.push(s[i] - '0'); // 数字入栈change = false;      // 不需打印}if (change){ // 打印后缀表达式stack<int> temp1, temp2;temp1 = st;while (!temp1.empty()){ // 将栈中元素倒序temp2.push(temp1.top());temp1.pop();}while (!temp2.empty()){ // 打印计算的前半段cout << temp2.top() << " ";temp2.pop();}for (int j = i + 1; j < s.length(); j++){ // 打印未计算的后半段cout << s[j] << " ";}cout << endl;}}
}
string toRPN(string s)
{                   // 中缀转后缀stack<char> st; // 结果栈stack<char> op; // 操作数栈for (int i = 0; i < s.size(); i++){if (s[i] == '('){op.push(s[i]);}else if (s[i] == ')'){while (op.top() != '('){st.push(op.top());op.pop();}op.pop(); // 弹出'('}else if (is_op(s[i])){while (!op.empty() && prority(op.top()) >= prority(s[i])){ // 当前符号不比栈顶符号优先级高st.push(op.top());op.pop();}op.push(s[i]);}else // 数字{st.push(s[i]);}}while (!op.empty()){ // 最后把op中的符号全部弹出压入stst.push(op.top());op.pop();}// 逆序放到ans中string ans;int len = st.size();while (len--){ans = st.top() + ans;st.pop();}return ans;
}
int main()
{string s;cin >> s;string s2 = toRPN(s); // 存放逆波兰式for (int i = 0; i < s2.length(); i++){cout << s2[i] << " ";}cout << endl;process_op(s2);return 0;
}

这篇关于MT3035 逆波兰式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/993998

相关文章

波兰媒体海外宣发:波兰媒体投放助力企业在波兰力挽狂澜-大舍传媒

引言 在全球化的背景下,企业对海外市场的开拓变得愈发重要。波兰作为中东欧地区的重要经济体之一,吸引了越来越多的企业眼球。在这一过程中,波兰媒体的海外宣发起到了关键作用。本文将重点探讨大舍传媒、比得哥什日报和瓦维尔快讯这三家波兰媒体在海外宣发中的作用,以及它们如何助力企业在波兰力挽狂澜。 大舍传媒:传播波兰文化与价值观 大舍传媒是一家在波兰有着广泛影响力的媒体公司。他们通过多种媒介形式,如电视

day12--150. 逆波兰表达式求值+239. 滑动窗口最大值+ 347. 前 K 个高频元素

一、150. 逆波兰表达式求值 题目链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation/description/ 文章讲解:https://programmercarl.com/0150.%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5

C语言 | Leetcode C语言题解之第150题逆波兰表达式求值

题目: 题解: int evalRPN(char** tokens, int tokensSize) {int n = tokensSize;int stk[(n + 1) / 2];memset(stk, 0, sizeof(stk));int index = -1;for (int i = 0; i < n; i++) {char* token = tokens[i];if (strl

Python | Leetcode Python题解之第150题逆波兰表达式求值

题目: 题解: class Solution:def evalRPN(self, tokens: List[str]) -> int:op_to_binary_fn = {"+": add,"-": sub,"*": mul,"/": lambda x, y: int(x / y), # 需要注意 python 中负数除法的表现与题目不一致}n = len(tokens)stack =

C++ | Leetcode C++题解之第150题逆波兰表达式求值

题目: 题解: class Solution {public:int evalRPN(vector<string>& tokens) {int n = tokens.size();vector<int> stk((n + 1) / 2);int index = -1;for (int i = 0; i < n; i++) {string& token = tokens[i];if (to

数据结构-------计算逆波兰表达式(后缀表达式)

一、 计算后缀表达式         1、读入一个后缀表达式(逆波兰表达式)判断:                (1)如果是数字,直接压栈(注意要压栈的是数字串,不是单个数字,例如256,压栈的是256,而不是2 、5 、6)                (2)如果是运算符,则从栈中退出两个元素,进行相应的运算后,把结果压入栈中(注意出栈元素的顺序)

数据结构-----栈(逆波兰表达式)----中缀转后缀

一、中缀表达式转换为逆波兰式        将一个普通的中序表达式转换为逆波兰表达式的一般算法是: 1、首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。 2、读入一个中缀表达式,为了方便起见,可在其最右端追加一个最低优先级运算符(如:#号)。(这样做的目的是,最后读入#号运算符时将运算符栈中所有运算符都输出)。 3、从左至右扫描该中缀表达式,如果当前字符是数字,则分析到该

栈的应用:实现逆波兰计算器

开篇 本篇文章是学习数据结构过程中的笔记,所以有时代码可能不够完整,会在后续的学习中记录下更完整的代码版本。 思路分析 后缀表达式又称逆波兰表达式,与前缀表达式类似,只是运算符位于操作数之后 举例说明:(3+4)*5-6对应的后缀表达式就是3 4 + 5 * 6 - 后缀表达式的计算机求值过程: 从左至右扫描表达式,遇到数字时,将数字压入栈,遇到运算符时,弹出栈顶的两个数,用运算符对

代码随想录算法训练营第十一天| 20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

20. 有效的括号 题目链接:20. 有效的括号 文档讲解:代码随想录 状态:so easy 思路: 使用栈,如果是左括号就入栈,如果是右括号则判断是否和栈顶括号匹配,如果匹配就出栈,否则判断遍历完字符串后栈中是否还有残留。 题解: public boolean isValid(String s) {if (s.length() % 2 != 0)return false

波兰表达式c语言递归

波兰表达式(Polish Notation),又称前缀表达式,是一种没有括号的算术表达式,其中运算符位于操作数之前。与常见的中缀表达式(如常见的数学表达式)不同,波兰表达式避免了对括号的需求,因为运算符的顺序明确了运算的优先级。 在C语言中实现波兰表达式求值的递归函数通常遵循以下步骤: 定义递归函数:创建一个递归函数,该函数接受一个字符数组(字符串)和当前索引作为参数。 处理基本情况:如果