Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java链接堆栈实现,can';我不明白为什么总是打印相同的号码_Java_Static_Stack_Variable Assignment_Computer Science - Fatal编程技术网

Java链接堆栈实现,can';我不明白为什么总是打印相同的号码

Java链接堆栈实现,can';我不明白为什么总是打印相同的号码,java,static,stack,variable-assignment,computer-science,Java,Static,Stack,Variable Assignment,Computer Science,所以我一直在努力完成大学的以下实验室。大部分代码都提供给我们,但我们被告知要填写LinkedStack.java代码的方法。概念非常简单,每个Node()对象包含一个对象类型变量(本例中为整数)和另一个Node()对象。LinkedStack()类用于初始化这些节点并对其数量设置限制。问题是,在执行StackTest.java后,返回以下内容: 18 18 18 18 18 18 18 18 18 18 6 6 6 6 6 6 当它应该返回以下内容时: 18 16 14 12 10 8 6 4

所以我一直在努力完成大学的以下实验室。大部分代码都提供给我们,但我们被告知要填写LinkedStack.java代码的方法。概念非常简单,每个Node()对象包含一个对象类型变量(本例中为整数)和另一个Node()对象。LinkedStack()类用于初始化这些节点并对其数量设置限制。问题是,在执行StackTest.java后,返回以下内容:

18 18 18 18 18 18 18 18 18 18
6 6 6 6 6 6
当它应该返回以下内容时:

18 16 14 12 10 8 6 4 2 0
6 5 4 3 2 1
另外,代码被广泛地评论过,所以我相信你能找出我没有提到的东西。此外,StackADT只是一个简单的接口,它所做的只是说明LinkedStack中使用的方法

当然,非常感谢所有帮助我的人

以下是所有代码(抱歉,我是新来的,不知道如何将其分组):

//***************************************************************
//LinkedStack.java
//
//对象堆栈类与推送操作的链接实现,
//砰的一声,我空空如也。
//
// ***************************************************************
公共类LinkedStack实现StackADT{
private Node top;//对堆栈顶部的引用
私有整数大小;
专用整数计数器=0;
// ---------------------------------------------------
//构造函数——初始化top
// ---------------------------------------------------
公共LinkedStack(){
top=新节点();
尺寸=10;
}
// ---------------------------------------------------
//如果元素未满,则将其添加到堆栈顶部,否则
//什么也不做。
// ---------------------------------------------------
公共无效推送(对象val){
计数器++;
如果(计数器>0&&计数器0){
Object val=top.getElement();
top=top.getNext();
计数器--;
返回(val);
}
否则{
返回(空);
}
}
// ---------------------------------------------------
//如果堆栈为空,则返回true,否则返回false。
// ---------------------------------------------------
公共布尔值为空(){
如果(计数器==0){
返回(真);
}
否则{
返回(假);
}
}
// ---------------------------------------------------
//如果堆栈已满,则返回true,否则返回false。
// ---------------------------------------------------
公共布尔值isFull(){
如果(计数器==大小){
返回(真);
}
否则{
返回(假);
}
}
}
Node.java:
//***********************************************************
//Node.java
//单个链接对象列表的常规节点。
//***********************************************************
公共类节点{
私有节点下一步;
私有对象元素;
//----------------------------------------------------
//创建一个空节点
//----------------------------------------------------
公共节点(){
next=null;
元素=空;
}
//----------------------------------------------------
//创建存储指定元素的节点
//----------------------------------------------------
公共节点(对象元素){
next=null;
this.element=元素;
}
//----------------------------------------------------
//返回此节点后面的节点
//----------------------------------------------------
公共节点getNext(){
下一步返回;
}
//----------------------------------------------------
//设置此节点后面的节点
//----------------------------------------------------
公共void setNext(节点){
下一个=节点;
}
//----------------------------------------------------
//返回存储在此节点中的元素
//----------------------------------------------------
公共对象getElement(){
返回元素;
}
//----------------------------------------------------
//设置存储在此节点中的元素
//----------------------------------------------------
公共void集合元素(对象元素){
this.element=元素;
}
}
StackTest.java:
// *******************************************************
//StackTest.java
//
//一个简单的驱动程序,练习推、弹出、满和空。
//由于自动装箱,我们可以将整数推送到一堆对象上。
//
// *******************************************************
公共类堆栈测试{
公共静态void main(字符串[]args){
StackADT stack=newlinkedstack();
//把一些东西推到堆栈上

对于(int i=0;i堆栈的工作方式是向堆栈顶部添加一个新节点,并将其下一个引用设置为先前的顶部节点

在构造LinkedStack时创建一个节点,然后在push方法中将对下一个节点的引用设置为自身(形成一个无限循环)

在命令您推送第一个项目之前,不应创建顶部节点。最底部的项目应将其下一个引用设置为null,以指示其下方不再有其他项目

public void push(Object val) {
    if(!isFull()) {
        counter++;
        Node lastTop = top;
        top = new Node(val);
        top.setNext(lastTop);
    }
}
您的
isEmpty()
方法只需要检查top是否为null

您的pop方法很好,但您应该使用isEmpty方法使代码更易于理解:

public Object pop() {
    if(!isEmpty()) {
        counter--;
        Node lastTop = top;
        top = top.getNext();
        return lastTop.getElement();
    } else {
        return null;
    }
}
//---------------------------------------------------
//如果元素未满,则将其添加到堆栈顶部,否则
//什么也不做。
// ---------------------------------------------------
公共无效推送(对象val){
计数器++;

如果(计数器>0&&counter,则问题在于推送功能:

      top.setNext(top);
      top.setElement(val);
您将top的下一个元素设置为自身,而不是创建新节点。因此,当您将元素设置为val时,您将覆盖pr
// ---------------------------------------------------
// Adds element to top of stack if it's not full, else
// does nothing.
// ---------------------------------------------------
  public void push(Object val) {
    counter++; 
    if(counter > 0 && counter <= size) {]
      top.setNext(top);
      top.setElement(val);
    }
    else {
      top.setElement(val);
    }
      top.setNext(top);
      top.setElement(val);
Node new_top = new Node(val); 
new_top.setNext(top);
top = new_top;