迭代堆栈

时间:2013-09-06 18:14:29

标签: c++ stack

我正在研究一个问题。

使用stack处理带括号的表达式。当您看到一个开括号时,请注意它已被看到。当您在左括号后看到一个紧密的括号时,pop元素将包括stack的左括号并包括它们。 push上的stack值表示已替换带括号的表达式。

这怎么可能?这需要迭代stack。例如,如果堆栈由char组成并用

初始化
This is just (a test) to see.

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

2 个答案:

答案 0 :(得分:1)

根据定义,堆栈中唯一可见的元素是堆栈的顶部。至少在形式上,std::stack强制执行此操作。实际上,能够更深入地观察甚至迭代通常是有用的;在这种情况下,您只是不使用std::stack。 (例如,std::vectorpush_backpop_backback构成了非常好的堆栈。

或者,std::stack的基础数据成员仅受保护,而非私有,因此您可以继承std::stack,并添加所有其他成员。

答案 1 :(得分:1)

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

我们举一个例子表达:
  (8-(1 + 2))/ 5
=(8-3)/ 5
= 5/5
= 1

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

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

所以,现在我有了 (8-3
此时,parenthesis_counter = 1.我继续阅读其余元素。

编辑:请注意,parenthesis_counter与解决方案无关,它仅用于帮助解释状态。