webForumDet fria alternativet

Generiska metoder/klasser -Hur funkar add()?

4 svar · 510 visningar · startad av roblj689

roblj689Medlem sedan apr. 20066 inlägg
#1

Hej,
jag har suttit och klurat länge på varför jag inte får detta att funka.
Försöker implementera en egen Stack, men utan att använda Javas klasser för det ändamålet.

1:
import java.util.Scanner;
2:
 
3:
public class MyStackTest {
4:
 
5:
    public static void main(String args[]) {
6:
 
7:
      MyStack<Integer> talStack = new MyStack<Integer>();
8:
      MyStack<String>  wordStack = new MyStack<String>();
9:
      Scanner keyboard = new Scanner(System.in);
10:
 
11:
      //Testning med heltal!
12:
      System.out.println("Testar med heltal!\n" +
13:
          "skriv in 5 heltal");
14:
     
15:
      for(int i = 1; i <= 5; i++) {
16:
   talStack.push(keyboard.nextInt());
17:
      }
18:
    }}
1:
import java.util.*;
2:
public class MyStack<E>{
3:
 
4:
   public E talStack;
5:
 
6:
public void push(int e){
7:
   
8:
   talStack.add(talStack);
9:
}
10:
   public void add(E talStack)
11:
   {
12:
      this.talStack = talStack;
13:
         }
14:
   
15:

Det går bara inte att lägga in värden i listan, förstår inte riktigt hur.
Nån som vet?

nitro2k01Medlem sedan aug. 20039 342 inlägg
#2

Ett första råd är att sätta dig och skissa på papper och se vad du egentligen håller på med. Det finns två huvudsakliga sätt att implementera en stack, med en länkad lista, eller med en array.
En länkad lista innebär att du har ett antal noder där varje nod har en variabel som pekar framåt till nästa föremål på stacken. Rotklassen bör lämpigen och innehålla något som pekar på det översta (Sist ditlagda) objektet.
Tänk dig följande:

 Rot -> null

Du har bara en rotnod. Alltså är det översta objektet på stacken null, eftersom det inte finns något översta objekt. Sedan när du lägger på ett objekt på stacken så vill du uppnå följande:

 Nod -> Tal 1
  |
  V
 Rot -> Tal 1

Noden pekar dels på talets objekt, och dels framåt till nästa objekt (Som råkar vara rotnoden eftersom 1 är ensamt på stacken)
Sedan vill du puffa ett objekt till till stacken. Då låter du det nya objektet peka framåt till noden för 1 som redan ligger på stacken, och så ändrar du pekaren för det översta objektet till det nya talet. Resultat:

 Nod -> Tal 2
  |
  V
 Nod -> Tal 1
  |
  V
 Rot -> Tal 2

Sedan ett tal till:

 Nod -> Tal 3
  |
  V
 Nod -> Tal 2
  |
  V
 Nod -> Tal 1
  |
  V
 Rot -> Tal 3

Sedan får du försöka omsätta detta i datastruktur och kod. Lycka till!

roblj689Medlem sedan apr. 20066 inlägg
#3

Tack för ditt svar!

Problemet är jag inte vet varför jag får kompileringsfel. Om jag implementerar med en Array.

MyStack<Integer> talStack = new MyStack<Integer>();

Borde det väl gå att använda den till att bilda en stack? Lägga till första elementet i arrayen och sedan nästa etc?

Jag m å s t e använda mig den ovanstående generiska(?) "Mystack", Fungerar inte den som ett fält, att man kan lägga till exempelvis genom talStack[1] = 2;

Väldigt tacksam för svar! :)

roblj689Medlem sedan apr. 20066 inlägg
#4

Exempel

Det här vill jag göra, men förstår inte hur med de generiska metoderna :(
Vet inte om det här är helt korrekt kod, ger säkert kompileringsfel, men tror det framgår ändå.

Nån vänlig själ som vet hur det skulle gå till med mitt "testprogram" MyStackTest ovan?

import java.util.Scanner;

public class Test {
	int [] talStack = new int[5];
    
	public static void main(String args[]) {
   
    Scanner keyboard = new Scanner(System.in);

      //Testning med heltal!
      System.out.println("Testar med heltal!\n" +
			 "skriv in 5 heltal");
      
      for(int i = 1; i <= 5; i++) {
    	  talStack.push(keyboard.nextInt());
      }
     
    }
	public void push(int e){
		talStack[1] = e;   //metoden sätter in första heltalet i fältet.
}
antilizaerMedlem sedan apr. 200357 inlägg
#5

Bara för att du deklarerar talstack som MyStack<Integer> talStack = new MyStack<Integer>(), betyder det inte att den blir en array, utan det som händer är att kompilatorn kommer tolka E som en Integer. Och på samma sätt kommer E tolkas som en String om du deklarar talStack som MyStack<String> talStack = new MyStack<String>().

Och eftersom E kan vara vad som helst, beroende på hur MyStack har blivit deklarera så finns det ingen add metod på denna så därför blir det kompileringsfel på raden talStack.add(talStack);

Ett exempel på hur det kan tänkas se ut för att fungera:

import java.util.List;
import java.util.ArrayList;

public class MyStack<E> {

    public List<E> talStack = new ArrayList<E>();

    public void push(E e){
        talStack.add(e);
    }

    // Skriv metoder för att hämta ut objekt från talStack listan
}
132 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)