0

我正在研究一个问题。

使用 astack处理带括号的表达式。当您看到一个左括号时,请注意它已被看到。当您在一个左括号之后看到一个右括号时,pop元素会向下到并包括 . 的左括号stackpush上的值stack以指示括号中的表达式已被替换。

这怎么可能?这将需要遍历一个stack. 例如,如果堆栈由chars 组成并初始化为

This is just (a test) to see.

我可以pop离开顶部,直到我看到一个封闭的括号并将每个单词存储push_front到不同的容器中,等等。然后复制回 astack但这间接解决了问题。我不明白你如何在不迭代的情况下回答问题,stack并且据我所知stack不使用迭代器或下标,那怎么可能呢?

4

2 回答 2

1

不,即使我同意原始问题可能更清楚,原始问题也不会要求您遍历堆栈。

举个例子:
(8-(1+2))/5
= (8-3)/5
= 5/5
= 1

我们怎样才能做到这一点?
我们从最左边的元素(数字、运算符或括号)开始读取,并将它们压入堆栈。当我们看到一个左括号时,我们增加括号计数器。当我们看到右括号时,我们不会将右括号压入堆栈,而是开始从堆栈中弹出元素,直到包括最近的左括号,递减括号计数器;我们弹出的项目,除了括号之外,我们将它们全部存储在另一个向量或容器中,评估它们并将结果推送到堆栈中。我们继续阅读剩下的元素。

所以,在上面的例子中,直到我们读到第一个右括号,我们有:
(8-(1+2
在这一点上,括号计数器 = 2 并且我已经将所有元素按原样推入堆栈。
现在我遇到一个右括号,我不推它。我弹出元素'2','+','1'和'(';将括号计数器减1,评估1 + 2返回3。因此我将3推入堆栈.

所以,现在我有
(8-3
在这一点上,括号计数器 = 1。我继续阅读其余的元素。

编辑:请注意,括号计数器与解决方案无关,它只是为了帮助解释状态。

于 2013-09-06T18:59:57.090 回答
1

根据定义,堆栈上唯一可见的元素是堆栈的顶部。至少在形式上,并std::stack强制执行这一点。实际上,能够更深入地观察甚至迭代通常很有用;在这种情况下,您只是不使用std::stack. (例如std::vector,使用push_back,pop_backback是一个很好的堆栈。

或者,底层数据成员std::stack仅受保护,而不是私有,因此您可以从 继承std::stack,并按您的方式添加所有其他成员。

于 2013-09-06T18:20:37.593 回答