使用堆栈计算算术表达式

时间:2018-06-06 13:00:45

标签: stack push pop

有没有办法在c#中使用堆栈计算像(2 + 3)-4这样的数学表达式?使用两个堆栈?需要一个c#代码..

1 个答案:

答案 0 :(得分:0)

很抱歉打算将此作为评论但是时间过长了:

你熟悉反向抛光表示法吗? (RPN)

从概念上讲(如果我没记错的话),你的堆栈看起来像这样:

+ 2 3 - 4

所以第一项+告诉你需要从堆栈中拉出两个项目,将它们加在一起,然后将结果推送到堆栈

但是我们得到一个看起来像这样的堆栈:

5 - 4

然后我们关闭第一个项目,一个5,并告诉我们什么,所以我一定做错了:D

如果是

2 3 + 4 - 

然后我们可以将前三个项目从堆栈中弹出,这样运算符就是+将两个数字加在一起并推送结果以便我们得到

5 4 - 

所以我们从堆栈中拉出三个项目并且操作符是减号因此我们知道从第一个中减去第二个,所以我们得到1并将其推送到堆栈,现在我们只有一个堆栈。 / p>

1

然后我们知道只有一个项目的堆栈就是结果。

但我也不认为这是正确的,因为有些运营商(例如平方根)只能处理一个号码,而不是两个号码。

哦等等 - 这https://en.wikipedia.org/wiki/Reverse_Polish_notation似乎表明这是正确的。我想它展望未来'在堆栈中。

如果你不能向前看'那么你可以使用两个堆栈,一个用于运算符,一个用于操作数(数字)。因此,您从操作队列中弹出操作,然后告诉您从操作数队列中弹出多少个操作数。

我们还可以(在开始计算之前)检查给定操作序列所需的操作数的正确性。例如。如果我们有

+ + + 

在操作堆栈中,我们知道我们最初需要四个操作数(每个加上删除两个并添加一个,净减少一个 - 所以每个额外的+需要堆栈上的另一个操作数,第一个需要两个操作数)而诸如平方根之类的操作会从堆栈中弹出一个数字然后将结果推回堆栈,因此无论我们调用多少次操作数,它都不会增加所需的操作数(超出初始值)。

有两个堆栈,它看起来像这样

2 3 4

+ -

所以我们弹出+,读取两个操作数,将它们加在一起,推送结果。然后我们弹出 - ,读取两个操作数,从第一个中减去第二个,并推送结果。

使用c#,两个堆栈实际上更容易,因为只需一个堆栈就需要一个操作数'堆栈' - 操作数可以是操作也可以是数字。

虽然有两个堆栈,一个可以只是一堆数字,另一个是一堆操作,你不必弄清楚类型问题,因为必须找出你从堆栈中取出的东西的类型