遍历堆栈
Iterate through a stack
我正在做一个问题。
使用stack
处理带括号的表达式。当您看到一个左括号时,请注意它已被看到。当您看到左括号后面的右括号时,pop
元素,包括stack
的左括号。 在stack
上push
一个值,以指示已替换带括号的表达式。
这怎么可能?这将需要遍历stack
。例如,如果堆栈由 char
组成并初始化为
This is just (a test) to see.
我可以从顶部pop
,直到看到一个封闭的括号,并将每个单词和push_front
存储到不同的容器中,等等。然后复制回stack
但这间接解决了问题。我不明白你如何在不遍历stack
的情况下回答问题,根据我的理解stack
不使用迭代器或下标,那怎么可能呢?
根据定义,堆栈上唯一可见的元素是堆栈的顶部。 至少在形式上,std::stack
强制执行这一点。 实际上,能够更深入地观察甚至迭代通常很有用;在这种情况下,您只是不使用std::stack
. (例如,std::vector
push_back
、pop_back
和back
可以形成一个非常好的堆栈。
或者,std::stack
的基础数据成员仅受保护,而不是私有的,因此您可以从std::stack
继承,并添加所有其他成员。
不,原始问题不会要求您遍历堆栈,即使我同意原始问题可能更清晰。
让我们举一个示例表达式:
(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,计算 1+2,返回 3。因此,我将 3 推入堆栈。
所以,现在我有
(8-3
此时,parenthesis_counter = 1。我继续阅读其余元素。
编辑:请注意,parenthesis_counter与解决方案无关,它只是为了帮助解释状态。
- 有什么方法可以遍历结构吗
- 在循环中按顺序遍历成员变量
- 遍历模板参数
- 在遍历处理程序的向量时注册和注销处理程序
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 遍历并行数组以确定C++中的最大数字
- 遍历顺序由 std::文件系统directory_iterator给出
- 遍历链表时的无限循环
- 遍历unordered_map向量
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- C++声明双链表,使用两个 for 循环双向遍历列表并打印
- 如何正确地推回然后遍历堆中对象的向量?
- 在使用 In Order 遍历成员函数时引发异常(堆栈溢出)时出现问题
- 使用递归的顺序二叉树遍历与使用堆栈的优缺点
- 二叉树顺序遍历导致堆栈溢出
- 遍历堆栈
- C/C++中具有固定大小堆栈的树遍历
- 符号如何影响调用堆栈遍历
- 如何在C++中遍历堆栈
- 在c++ 11中遍历堆栈时,无效的范围表达式