<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>算法 on Rancho&#39;s Notes</title>
    <link>https://fan-pengfei.top/tags/%E7%AE%97%E6%B3%95/</link>
    <description>Recent content in 算法 on Rancho&#39;s Notes</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Fri, 08 Jul 2022 15:36:23 +0000</lastBuildDate>
    <atom:link href="https://fan-pengfei.top/tags/%E7%AE%97%E6%B3%95/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>算数式计算</title>
      <link>https://fan-pengfei.top/posts/%E7%AE%97%E6%95%B0%E5%BC%8F%E8%AE%A1%E7%AE%97/</link>
      <pubDate>Fri, 08 Jul 2022 15:36:23 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E7%AE%97%E6%95%B0%E5%BC%8F%E8%AE%A1%E7%AE%97/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;字符串算式先转为逆波兰式(后缀表达式)，然后计算；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;一求逆波兰表达式&#34;&gt;一、求逆波兰表达式&lt;/h2&gt;
&lt;h3 id=&#34;核心思想&#34;&gt;核心思想：&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;逆波兰算法的核心思想是将普通的中缀表达式转换为后缀表达式。&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;**什么是中缀表达式？**例如a+b，运算符在两个操作数的中间。这是我们从小学开始学习数学就一直使用的表达式形式。
**什么是后缀表达式？**例如a b + ，运算符在两个操作数的后面。后缀表达式虽然看起来奇怪，不利于人阅读，但利于计算机处理。
&lt;strong&gt;转换为后缀表达式的好处是：&lt;/strong&gt;
去除原来表达式中的括号，因为括号只指示运算顺序，不是实际参与计算的元素。
使得运算顺序有规律可寻，计算机能编写出代码完成计算。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;核心步骤&#34;&gt;核心步骤：&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;逆波兰算法的核心步骤就2个：&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;将中缀表达式转换为后缀表达式，例如输入的原始表达式是 3*(5+7) ，转换得到 3 5 7 + *
根据后缀表达式，按照特定的计算规则得到最终计算结果&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;具体步骤&#34;&gt;具体步骤：&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;中缀表达式转换为后缀表达式：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;你需要设定一个栈SOP,和一个线性表 L 。SOP用于临时存储运算符和左括号分界符( ，L用于存储后缀表达式。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;遍历原始表达式中的每一个表达式元素：
如果是操作数，则直接追加到 L中。只有 运算符 或者 分界符（ 才可以存放到 栈SOP中；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果是分界符：
如果是左括号 ( ， 则 直接压入SOP，等待下一个最近的 右括号 与之配对。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果是右括号 ) ，则说明有一对括号已经配对(在表达式输入无误的情况下)。不将它压栈，丢弃它，然后从SOP中出栈，得到元素e，将e依次追加到L里。一直循环，直到出栈元素e 是 左括号 ( ，同样丢弃他。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果是运算符（用op1表示）：
如果SOP栈顶元素（用op2表示） 不是运算符，则二者没有可比性，则直接将此运算符op1压栈。 例如栈顶是左括号 ( ，或者栈为空。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果SOP栈顶元素（用op2表示） 是运算符 ，则比较op1和 op2的优先级。如果op1 &amp;gt; op2 ，则直接将此运算符op1压栈。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果不满足op1 &amp;gt; op2，则将op2出栈，并追加到L，再试图将op1压栈，如果如果依然不满足 op1&amp;gt;新的栈顶op2，继续将新的op2弹出追加到L ，直到op1可以压入栈中为止。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
