【问题标题】:Understanding postfix expression evaluation code理解后缀表达式求值代码
【发布时间】:2011-12-05 16:47:57
【问题描述】:

我正在尝试理解这段代码。它做什么它后缀表达式评估。我在理解代码时遇到问题。如果有人可以帮助我,我将非常感激。

#include <iostream>
#include <cstring>
#include <stack>
using namespace std;
int main()
{


    //suppose a contains the string..
    //n is the length of string...
    char a[10]="A+B/C";
    int n = strlen(a)
    stack<int>s;
    for (int i=0;i<n;i++)
    {
        if (a[i]=='+')
        {
            s.push(s.pop()+s.pop());
            int temp1 = s.top();
            s.pop();
            int temp2 = s.top();
            s.pop();
            s.push(temp1 * temp2);
        }
        if (a[i]=='*')
            s.push(s.pop() * s.pop());

        if ((a[i]>='0') && (a[i]<='9'))
            s.push(0);
        while ((a[i]>='0') && (a[i]<='9'))
            s.push(10*s.pop()+(a[i++]-'0'));
    }

    cout<<s.pop()<<endl;

    return 0;
}

提前致谢。

【问题讨论】:

  • 你为a写过那个例子吗?因为它不是后缀。
  • stack::pop() 是一个空函数。 这段代码一团糟。只需在 SO 上搜索后缀计算器,您就会找到几十个(更好的)sn-ps
  • 为了好玩和咯咯笑,这是我很久以前写的:stackoverflow.com/questions/5631345/…
  • 我修复了缩进(看起来像是混合空格和制表符被错误扩展的结果),但仍然缺少分号,当然pop()的使用不正确。

标签: c++ string stack


【解决方案1】:

This site 看起来是一个很好的资源来了解这里发生的事情,但表达式应该使用数字,而不是字母。

假设您有中缀表达式 1+2*3-4*5。对应的后缀是 123*+45*-。首先,您首先从左到右扫描字符串。前三个数字是操作数,因此它们将按 1(底部)、2(中间)、3(顶部)的顺序存储在堆栈中。接下来,有一个 * 运算符。为了解决这个问题,将前两个操作数从堆栈中弹出并相乘(弹出的第一个是右操作数,第二个是左操作数)。这将计算为 2*3=6,并且 6 将存储在堆栈中,使其成为 1、6。

接下来,有一个 + 运算符。 1 和 6 被弹出并相加,7 存储在堆栈中。在此之后,4 和 5 也被压入堆栈(7、4、5)。下一个字符是另一个 * 运算符,因此它计算 4*5=20 并将 20 压入堆栈 (7, 20)。

最后,有一个 - 运算符。弹出 7 和 20 并计算为 7-20=(-13)。这被压入堆栈并准备弹出作为您的最终答案。

希望这有助于消除任何困惑(假设我正确阅读了您的问题)。

【讨论】:

    猜你喜欢
    • 2011-03-30
    • 2013-04-03
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多