首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >遍历堆栈

遍历堆栈
EN

Stack Overflow用户
提问于 2013-09-07 02:14:29
回答 2查看 2.5K关注 0票数 0

我正在做一个问题。

使用stack处理带括号的表达式。当您看到一个左括号时,请注意它已经被看到了。当您看到左括号后面有一个右括号时,pop元素会向下延伸到stack的左括号并包括在内。将一个值pushstack上,以指示带括号的表达式已被替换。

这怎么可能呢?这将需要遍历stack。例如,如果堆栈由char组成,并且初始化为

代码语言:javascript
运行
复制
This is just (a test) to see.

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

EN

回答 2

Stack Overflow用户

发布于 2013-09-07 02:20:38

根据定义,堆栈上唯一可见的元素是堆栈的顶部。至少在形式上,std::stack强制执行了这一点。实际上,能够看得更深一点,甚至是迭代,通常是很有用的;在这种情况下,您不需要使用std::stack。(例如,带有push_backpop_backbackstd::vector是一个非常好的堆栈。

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

票数 1
EN

Stack Overflow用户

发布于 2013-09-07 02:59:57

不,原始问题并没有要求您遍历堆栈,尽管我同意原始问题可以更清晰。

让我们以一个表达式为例:

(8-(1+2))/5

= (8-3)/5

= 5/5

=1

我们如何才能做到这一点?

我们从最左边的元素(数字、运算符或括号)开始读取,并将它们推入堆栈。当我们看到一个左括号时,我们递增parenthesis_counter。当我们看到结束括号时,我们不会将结束括号推入堆栈,而是开始从堆栈中弹出元素并包括最近的开始括号,递减parenthesis_counter;我们弹出的项,我们将除括号之外的所有项都存储在另一个向量或容器中,计算它们并将结果推入堆栈。我们继续阅读左边的元素。

因此,在上面的例子中,在我们读到第一个闭括号之前,我们有:

(8-(1+2

此时,parenthesis_counter =2,我已经将所有元素按原样推送到堆栈中。

现在我遇到一个右括号,我不会按下它。我弹出元素'2','+','1‘和'(';将parenthesis_counter减去1,计算返回3的1+2。因此我将3推入堆栈。

所以,现在我有了

(8-3

此时,parenthesis_counter = 1。我继续读取其余的元素。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18664061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档