【问题标题】:Postfix notation validation?后缀符号验证?
【发布时间】:2009-04-25 22:28:32
【问题描述】:

评估包含后缀表达式(例如:3 5 +)的字符串(数组,某物)以检查有效性的好方法是什么?

【问题讨论】:

  • 请更准确地说“有效”或“无效”是什么意思,也许有例子。

标签: validation postfix-notation


【解决方案1】:

我在这里假设您所说的 valid 是指执行代码永远不会下溢堆栈,并且会在堆栈上留下一个值。如果您有更严格的有效性概念,则需要更复杂的检查器。

如果你想检查这种有效性,没有必要评估字符串,你可以使用计数器,而不是堆栈。如果您进行评估,计数器会跟踪将在堆栈上的值的数量。为简化起见,假设您只有文字、二元运算符和一元运算符。该算法使用特殊的递减操作:如果递减时,计数器低于零,则字符串无效:

  1. 将计数器初始化为 0。
  2. 当您看到文字时,增加计数器。
  3. 当您看到二元运算符时,将计数器递减两次,然后再递增。
  4. 当您看到一元运算符时,先递减计数器,然后再递增。
  5. 在字符串的末尾,如果计数器为 1,并且从未低于 0,则该字符串有效。

【讨论】:

  • 那么,根据您的指示,在每个备用文字处,计数器应该递减两次然后递增?我问是因为我没有完全理解它们。
  • 请注意,在第 3 步和第 4 步中,计数器先递减,然后再递增。这是有原因的。每次递减计数器后,您都必须检查计数器是否低于 0。否则可以验证无效的 RPN,例如:[2, +, 2] 将是有效的。
  • 这将允许 {"12", "5.0", "3","+"} 有效。
  • @ChristopherConnery 不,这将在执行结束时让 counter = 2 并回答状态检查 counter = 1
【解决方案2】:

后缀表达式有效当且仅当:

1) 前两个元素是操作数(值),

2) 最后一个元素是一个运算符,并且

3) 对于每 n 个值,有 n-1 个运算符,并且

4) 在 n 个元素的列表中,从索引 i = 0 开始,对于 i 1 )组成的元素后跟 ( k-1) 运营商。当k=1时,后面的算子数=k=1。

【讨论】:

  • 你不需要额外的第四个条件。如果后缀表达式遵循前 3 个条件,我们始终可以计算该后缀表达式。
【解决方案3】:

算法:维护一个堆栈并扫描 后缀表达式从左到右 – 如果元素是数字,则将其推入 堆 – 如果元素是运算符O,则弹出两次 并分别得到A和B。计算 BOA 并将其推回堆栈 – 当表达式结束时,数字 在堆栈中是最终的答案

//为了有效性如果你在堆栈中只剩下一个数字,它的正确表达式

//如果你在堆栈中留下了多个数字并且没有运算符,那么它是错误的

//如果堆栈中只有一个或没有数字并且操作符离开,那么它是错误的

【讨论】:

    【解决方案4】:

    检查后缀表达式是否有效:(如果输入在 char 数组中) 1.操作数的数量必须等于no。运营商 + 1。 要检查这一点,请保留一个检查变量。 检查= 0。对每个操作数递增 this,对每个运算符递减。如果最终它的值为 1,则表达式有效。

    2.数组的前2个元素必须是操作数。没有后缀表达式可以将运算符作为第一个或第二个元素。 通过 if 控制语句检查。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-10
      • 2013-07-05
      • 2016-07-10
      • 1970-01-01
      • 1970-01-01
      • 2020-05-09
      • 2015-11-08
      • 1970-01-01
      相关资源
      最近更新 更多