私は現在 LinkedStacks を始めていますが、なぜ toString と pop メソッドが機能しないのだろうと思っていました。私が使用したメソッドは、本で指定されたデフォルトの Pop メソッドと toString メソッドであり、残りは私が作業してうまく機能しています。push メソッドは要素を完全に追加します。ピークは、リストとサイズを変更せずに一番上の要素を見て、プッシュ メソッドを使用した回数を返します。pop メソッドは奇妙なことに 1 回しか機能せず、エラーが発生します。スタックのセクションにある toString メソッドの本が提供する例にも注意してください。喜んでアドバイスをいたしますが、私は初心者であり、学習中であることをご了承ください。これはクラスのコードです:
コード
public class LinkedStack<T> implements Stack<T> {
private int count;
private LinearNode<T> top;
//-----------------------------------------------------------------
// Creates an empty stack using the default capacity.
//-----------------------------------------------------------------
public LinkedStack()
{
count = 0;
top = null;
}
@Override
public boolean IsEmpty()
{
if(top == null)
{
System.out.println("Stack is empty");
}
return top == null;
}
@Override
public void Push(T element)
{
top = new LinearNode(element, top);
System.out.println(element);
count++;
}
@Override
public T Pop()
{
T result;
System.out.println("Lets pop the top element!");
if (count == 0)
{
System.out.println("Pop operation failed. "+ "The stack is empty.");
}
result = top.getElement();
top = top.getNext();
count--;
System.out.println("The element that we have poped is :" + result);
return result;
}
Override
public String toString()
{
String result = "<top of stack>\n";
LinearNode current = top;
while (current != null)
{
result += current.getElement() + "\n";
current = current.getNext();
}
return result + "<bottom of stack>";
}
@Override
public T Peek() {
System.out.println("Lets peek the top element!");
if(count == 0)
{
System.out.println("Peek failed stack is empty");
}
System.out.println("The element that we have peeked is: " + top.getElement());
return top.getElement();
}
@Override
public int Size() {
System.out.println("The size of the list now is: " + count);
return count;
}
}
メインクラスのコード:
パブリック クラス LSmain {
public static void main(String[]args)
{
LinkedStack<Integer> main = new LinkedStack<>();
main.Push(1);
main.Push(2);
main.Push(3);
main.Size();
main.Peek();
main.Pop();
main.Pop();
main.Size();
main.toString();
}
}
pop メソッドを 2 回使用して出力する
1
Exception in thread "main" java.lang.NullPointerException
2
3
The size of the list now is: 3
Lets peek the top element!
The element that we have peeked is: 3
Lets pop the top element!
The element that we have poped is: 3
Lets pop the top element!
at LinkNod.LinkedStack.Pop(LinkedStack.java:64)
at LinkNod.LSmain.main(LSmain.java:22)
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)
popメソッドを2回使わずに出力
run:
1
2
3
The size of the list now is: 3
Lets peek the top element!
The element that we have peeked is: 3
Lets pop the top element!
The element that we have poped is: 3
The size of the list now is: 2
分析
/これは実際に新しいノードを作成し、パラメーターに挿入された値を保存します。間違いは、同じリストにトップを割り当てることができないことでした。これを行うと、リストはトップである1つのノードのみで作成されるためです。私の過去のコードが言ったように、私は一番上のレンガがそれ自体に等しいと言っていただけです。したがって、クラスから私が理解しているのは、要素を格納する新しいオブジェクト型 LinearNode を作成することでした。その場合、top はその新しい Node の値と等しくなります。この場合、1 つではなく複数のノードが存在するため、Pop が機能します。toString メソッドに関する追加の注意事項は、単純に return; Java では値が表示されることがありますが、ほとんどの場合、System.out.println(); を追加する必要があるという意味ではありません。メソッドを呼び出すときはドライバーで、または代わりにメソッドで。/
プッシュ方法の修正:
@Override
public void Push(T element)
{
LinearNode<T> current = new LinearNode<>(element);
current.setNext(top);
top = current;
count++;
}
メインクラスのコード:
public class LSmain {
public static void main(String[]args)
{
LinkedStack<Integer> list = new LinkedStack<>();
System.out.println("Let's make a List!");
System.out.println("Push 3 times.");
System.out.println("Check the size.");
System.out.println("Peek the top element.");
System.out.println("Pop three times.");
System.out.println("The size now should be zero!" + "\n");
list.Push(1);
list.Push(2);
list.Push(3);
System.out.println(list.toString());
list.Size();
list.Peek();
list.Pop();
list.Pop();
list.Pop();
list.Size();
}
機能出力
run:
Let's make a List!
Push 3 times.
Check the size.
Peek the top element.
Pop three times.
The size now should be zero!
<top of stack-->[3][2][1]<--bottom of stack>
Let's check the size of the list!
The size of the list is: '3'
Lets peek the top element!
The element that we have peeked is: [3]
Lets pop the top element!
The element that we have poped is: '3'
Lets pop the top element!
The element that we have poped is: '2'
Lets pop the top element!
The element that we have poped is: '1'
The size of the list is...Woah.
The list size is now: '0'
Push more elements!
BUILD SUCCESSFUL (total time: 3 seconds)
助けてくれてありがとう!PS: メソッド宣言をキャメルケースに変更するのを忘れていました。
LinearNode コード#
/新しい Node オブジェクトを作成して push メソッドを修正しようとすると、パラメーターが正しくなく、問題が発生しました。/
パッケージ LinkNod;
public class LinearNode<T> {
private LinearNode<T> next; //se guarda la referencia del Nodo
private T element; //Lista vacia
public LinearNode()
{
next = null;
element = null;
}
//-----------------------------------------------------------------
// Creates a node storing the specified element.
//-----------------------------------------------------------------
public LinearNode (T elem)
{
next = null;
element = elem;
}
//-----------------------------------------------------------------
// Returns the node that follows this one.
//-----------------------------------------------------------------
public LinearNode<T> getNext()
{
return next;
}
//-----------------------------------------------------------------
// Sets the node that follows this one.
//-----------------------------------------------------------------
public void setNext (LinearNode<T> node)
{
next = node;
}
//-----------------------------------------------------------------
// Returns the element stored in this node.
//-----------------------------------------------------------------
public T getElement()//asigna valor
{
return element;
}
public void setElement(T elem)
{
element = elem;
}
}