首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在添加新节点时使用堆栈存储treap节点。为什么我会得到一个EmptyStackException?

在添加新节点时使用堆栈存储treap节点。为什么我会得到一个EmptyStackException?
EN

Stack Overflow用户
提问于 2019-04-27 16:18:20
回答 1查看 215关注 0票数 0

我正在用Java构建一个treap类。下面是我用来向treap添加新节点的函数。这个过程是:向下遍历到treap的底部(同时将路径中的每个节点添加到一个本地堆栈中),首先只关心BST结构,然后,一旦到达底部,我就利用我构建的堆栈通过循环重新建立堆不变量。

这听起来应该可以工作,但我一直得到一个EmptyStackException。一旦调用私有的"reheap“函数,就会发生这种异常。

add函数对添加到树中的第一个节点有效,例如: testTree.add (4 ,19);但在第二次添加节点时失败,如随后调用: testTree.add (2 ,31);

这是完整的错误:

代码语言:javascript
运行
AI代码解释
复制
Exception in thread "main" java.util.EmptyStackException
    at java.util.Stack.peek(Unknown Source)
    at classes.Treap.reheap(Treap.java:137)
    at classes.Treap.add(Treap.java:130)
    at classes.Treap.main(Treap.java:220)

130 --指的是对add函数137底部的reheap的调用--指的是私有reheap函数220的while循环--指的是我在main中添加新节点的尝试。

我试着改变reheap函数中的条件,但是没有用。

代码语言:javascript
运行
AI代码解释
复制
boolean add(E key, int priority) {
        Stack<Node<E>> stack = new Stack<Node<E>>();
        if(root == null) {
            Node<E> newroot = new Node<E>(key, priority);
            root = newroot;
            stack.push(root);
            return true;
        }else {

            Node<E> current = new Node<E>(root.data, root.priority); //placeholder, used for traversing
            Node<E> added = new Node<E>(key, priority);  //node to be added to the treap
            if(this.find(key) == true){
                return false;
            }else {
                if(current.right == null && current.left == null) {
                    stack.push(current);
                    if(key.compareTo(current.data) < 0)
                        current = current.left;
                    else
                        current = current.right;
                }
                else {
                    while(current.right != null || current.left != null) {
                        if(key.compareTo(current.data) < 0) {
                            stack.push(current);
                            current = current.left;
                        }
                        if(key.compareTo(current.data) > 0) {
                            stack.push(current);
                            current = current.right;
                        }
                    }
                }
                if(key.compareTo(stack.peek().data) < 0)
                    stack.peek().left = added;
                else if(key.compareTo(stack.peek().data) > 0)
                    stack.peek().right = added;
                if(!stack.isEmpty())
                    this.reheap(added, stack);
                return true;
            }
        }
    }

    private boolean reheap(Node<E> added, Stack<Node<E>> stack) {
        while(added.priority > stack.peek().priority && !stack.isEmpty()) {
            if(stack.peek().right == added)
                stack.peek().rotateLeft();
            else
                stack.peek().rotateRight();
            stack.pop();
        }
        return true;
    }

在第二次调用( testTree.add (2 ,31);)之后,我应该会得到一个带有结构的树( Node(2,null,Node(4 )。<--这当然是在重新堆积之后。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-27 17:06:04

在窥视堆栈之前,您需要进行空栈检查!

代码语言:javascript
运行
AI代码解释
复制
while(!stack.isEmpty() && added.priority > stack.peek().priority) {...}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55882490

复制
相关文章
python合并两列
需要把数字类型转化为字符串类型,再进行连接 第一种 df1 = pd.DataFrame({'Year': ['2014', '2015'], 'quarter': ['q1', 'q2']}) df1['period'] = df[['Year', 'quarter']].apply(lambda x: ''.join(x), axis=1) df1 Year quarter period 0 2014 q1 2014q1 1 2015 q2 2015q2 第二
用户1359560
2018/08/27
3.8K0
Hadoop两列数据的排序
如果利用mapreduce过程的自动排序,只能实现根据第一列排序,现在需要自定义一个继承自WritableComparable接口的类,用该类作为key,就可以利用mapreduce过程的自动排序了。代码如下:
星哥玩云
2022/06/30
1.7K0
随机日志:两列显示
  看到别人的随机日志都是现实两列,我这一直显示一列,一是因为显示一列不好看,二是提供的信息量太低。因此改成两列还是很有必要的,于是自己写了些css样式,添加到主题的style.css文件的最下面。
the5fire
2019/02/28
9840
Pandas数据处理——通过value_counts提取某一列出现次数最高的元素
Pandas数据处理——渐进式学习——通过value_counts提取某一列出现次数最高的元素
红目香薰
2023/02/23
1.4K0
Pandas数据处理——通过value_counts提取某一列出现次数最高的元素
JS的左右两列自动拉伸对齐
该文提供了一个JS代码,用于实现两个区块自动对齐。具体来说,通过将两个区块的ID分别作为参数传递给函数,该函数将比较两个区块的高度,并相应地更改高度以使它们对齐。该代码可用于任何具有ID的区块,并且可以在任何HTML文档中使用。
练小习
2017/12/29
3.6K0
pandas的columns函数_python value_counts
1、使用DataFrame.index = [newName],DataFrame.columns = [newName],这两种方法可以轻松实现。
全栈程序员站长
2022/09/30
2.6K0
2.布局解决方案 两列、三列、多列、不定宽+一列自适应<6>
和上面的解决方案是一样的,自己动脑筋哦 下面的overflow的方式 display:table和flex大家自己练习。
河湾欢儿
2018/09/06
1.7K0
两种主要列存储方式的区别
Bigtable,HBase,Hypertable和Cassandra都被称为列存储,因为它们能够单独存储和访问列族。 这使它们看起来与列存储(如Sybase IQ,C-Store,Vertica,VectorWise,MonetDB,ParAccel和Infobright)处于相同的类别,这些列存储也可以单独访问列。 我认为,称呼这两个系统的列存储导致了大量的混乱和错误的预期。这篇博客文章试图澄清一些这种混乱,突出这些集合系统之间的高级差异。 最后,我将提出一些可能的方法来重命名这些组,以避免将来混淆。
哒呵呵
2018/08/06
1.5K0
在一个df里,怎么根据两列去把另外两列合并呢?
前几天在Python最强王者交流群【群除我佬】问了一个Pandas处理的问题,提问截图如下:
Python进阶者
2023/03/02
1.6K0
在一个df里,怎么根据两列去把另外两列合并呢?
两列布局——但只用右浮动
通过这个实验我明白了一个知识点,做左右结构的时候,不用把左边的写上左浮动,只需要把有浮动的块放到最前边,并设置有浮动,左边的放在有浮动的下边而且不用管,这样,父元素也不用清楚浮动,左边的元素也不用左浮动,一切就依旧会和自己做左右布局的老方法一样的效果。切记,结构上,把有浮动的元素放到前边,并设置右浮动。 为了试验不用清楚浮动,我把clearfix的相关代码注销了。 上代码: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset
xing.org1^
2018/05/17
8900
python用符号拼接DataFrame两列
碰到Null值时,会报错,因为none不可与str运算 解决如下,加入if判断即可
诡途
2022/01/07
1.7K0
小程序-两列瀑布流布局
新的设计图是按两列瀑布流排版的,类似于花瓣网那种。看到设计图后就在网上找,如何在小程序简单的实现,后来找到了一个特别简单的方法,就是利用wx:if和数组的下标对2取余来判断是排在左列还是排在右列, 话不多说看图上代码:
九旬
2020/10/23
2K0
小程序-两列瀑布流布局
基于R的竞争风险模型的列线图
将竞争风险模型的cmprsk包加载到R中,使用cuminc()函数和crr()函数可以进行考虑竞争风险事件生存数据的单变量分析和多变量分析。以往推文我们已经详细描述了基于R语言的实现方法,这里不再赘述。那么,您如何看待竞争风险模型呢?如何绘制竞争风险模型的列线图?在这里,我们演示如何绘制基于R的列线图。
用户6317549
2020/07/22
4.2K0
基于R的竞争风险模型的列线图
Excel中两列(表)数据对比的常用方法
Excel中两列数据的差异对比,方法非常多,比如简单的直接用等式处理,到使用Excel2016的新功能Power Query(Excel2010或Excel2013可到微软官方下载相应的插件)实现各种复杂的数据整理后再进行对比,可以根据实际需要选择使用。
大海Power
2021/08/30
16.9K0
SQL练习之两个列值的交换
SELECT * FROM dbo.test2 现在我们将Province列值和Company列值互换,代码如下: UPDATE test2 SET Company=Province, Provin
郑小超.
2018/01/24
3.6K0
SQL练习之两个列值的交换
【R语言】数据框按两列排序
我相信大家经常会使用Excel对数据进行排序。有时候我们会按照两个条件来对数据排序。假设我们手上有下面这套数据,9个人,第二列(score)为他们的考试成绩,第三列(code)为对应的评级。80分以上为优秀,60-80为良,60以下为差。
生信交流平台
2022/09/21
2.3K0
【R语言】数据框按两列排序
PowerQuery拆分两列,并数据相对应
【问题】把姓名与电话列拆分为行,姓名与电话是按顺序对应的。难点:姓名与电话的个数不定
哆哆Excel
2022/10/31
1K0
VBA:基于指定列删除重复行
文章背景:在工作生活中,有时需要进行删除重复行的操作。比如样品测试时,难免存在复测数据,一般需要保留最后测试的数据。之前通过拷贝行的方式保留最后一行的数据(参见文末的延伸阅读1),但运行效率较低。目前通过借助数组和字典达到删除重复行的效果。
Exploring
2022/12/18
3.5K0
VBA:基于指定列删除重复行
生成两表(列)数据全部组合的极简方法
在《PQ-综合实战:根据关键词匹配查找对应内容》里,为了拼出两个表数据的全部组合,使用的方法是先分别给每个表添加一列,然后再用合并查询的方法来完成,而且合并完成后还得再把添加的列给删掉,步骤繁多——实际上,如果使用利用跨查询的引用方式,该问题将极其简单。
大海Power
2021/08/30
1.3K0
点击加载更多

相似问题

基于不同列值的value_counts列

12

基于value_counts列的数据过滤(熊猫)

48

在python中基于多列获取value_counts

12

如何迭代包含两列的value_counts输出?

10

Python计算两列的value_counts并使用groupby

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文