Kolejki i stosy

0

Witam, nie wiem czy ktos tu uzywa SPOJA, ale mam problem z tym zadaniem:

Napisz program realizujący obsługę zdarzeń związanych z przetwarzaniem stosów i kolejek. Każda linia w pliku wejściowym stanowi osobne polecenie. Każde polecenie informuje o typie operacji i zawsze zawiera numer stosu i/lub kolejki, których dotyczy. Numer stosu lub kolejki jest liczbą całkowitą z zakresu 0,...,9 (program obsługuje maksymalnie 10 stosów i 10 kolejek). Każdy stos/kolejka może zawierać maksymalnie 10 elementów (elementy to liczby całkowite z przedziału 0,...,1000). Przed przyjęciem pierwszego polecenia należy przyjąć, że żaden stos oraz żadna kolejka nie zostały jeszcze utworzone. Polecenia mogą pojawiać się na wejściu w dowolnej kolejności.

Zadanie zostało podzielone na 4 stopnie trudności (4 testy). Poniżej znajduje się opis poleceń, które program powinien obsłużyć, aby pozytywnie zaliczyć każdy z testów.
Test 1 (3 pkt.)

Spis zdarzeń, które należy obsłużyć:

Polecenie nakazujące utworzenie (pustego) stosu i numerze i:
new_s i
Dodanie elementu e do stosu numer i:
push i e
Usunięcie elementu ze szczytu stosu numer i:
pop i
Przeniesienie elementu ze szczytu stosu numer i na stos numer j:
stack->stack i j
Likwidacja stosu numer i wraz ze wszystkimi jego elementami:
delete_s i
Wypisanie zawartości stosu o numerze i (elementy stosu wypisujemy w jednej linii, oddzielone spacjami, liczba będąca na szczycie stosu jest ostatnią liczbą w linii; jesli stos jest pusty, to wypisujemy napis empty):
print_s i 

Uwaga: w przypadku wszystkich poleceń, z wyjątkiem komendy 'drukuj_stos', nie należy wypisywać żadnych znaków na wyjście, a jedynie dokonywać odpowiednich zmian w zawartościach stosów. Wszystkie polecenia są poprawne (opis niepoprawnych poleceń - patrz Test 2).
Test 2 (2 pkt.)

Należy obsłużyć wszystkie polecenia wymienione w Teście 1, lecz należy uwzględnić możliwość pojawienia się następujących sytuacji błędnych:

Próba usunięcia elementu z pustego stosu. Należy w takiej sytuacji w osobnej linii na wyjściu wypisać:
error: stack is empty
Próba dodania elementu do pełnego stosu. Należy wypisać:
error: stack is full 

Test 1 - przykład

Wejście:
new_s 0
push 0 96
new_s 5
print_s 5
push 5 28
push 5 99
push 5 88
pop 0
print_s 5
push 0 65
stack->stack 5 0
print_s 0

Wyjście:
empty
28 99 88
65 88

Test 2 - przykład

Wejście:
new_s 0
push 0 96
new_s 5
print_s 5
push 5 28
push 5 99
push 5 33
push 5 88
pop 0
print_s 5
pop 0
push 0 65
push 5 99
push 5 13
push 5 99
push 5 1
push 5 99
push 5 0
push 5 9
push 5 87
stack->stack 5 0
print_s 0

Wyjście:
empty
28 99 33 88
error: stack is empty
error: stack is full
error: stack is full
65 0

Kod dziala dobrze dla przykladowych zestawow do testow, jednak dostaje blad "za mało punktów".
Prosze wiec o pomoc w znalezieniu bledu w kodzie (podobno program podaje bledna odpowiedz dla zestawu danych, ktore SPOJ przesyla programowi):

Oto kod mojego programu (jest tam deklarowane coś dot. kolejek, ale na razie się nimi nie zajmuję, bo chcę zrobić część dot. stosów):

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


class main {

	public static void main (String[] args) throws IOException {
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		String slowo=" ";
		int p1=0;
		int p2=0;
		while(slowo!=null && slowo.length()>0) {
		slowo=br.readLine();
		if(slowo!=null) {
		p1=slowo.indexOf(" ");
		if(p1>-1) p2=slowo.indexOf(" ",p1+1);
		else p2=-1;
		if(slowo.contains("new_s")) new_s(Integer.parseInt(slowo.substring(p1+1)));
		else if(slowo.contains("push")) push(Integer.parseInt(slowo.substring(p1+1,p2)),Integer.parseInt(slowo.substring(p2+1)));
		else if(slowo.contains("pop")) pop(Integer.parseInt(slowo.substring(p1+1)));
		else if(slowo.contains("stack->stack")) przeniesStos(Integer.parseInt(slowo.substring(p1+1,p2)),Integer.parseInt(slowo.substring(p2+1)));
		else if(slowo.contains("delete_s")) delete_s(Integer.parseInt(slowo.substring(p1+1)));
		else if(slowo.contains("print_s")) print_s(Integer.parseInt(slowo.substring(p1+1)));
		}
		}
	}
	
	static int[][] stosy=new int[10][10]; //wiersze - stosy, kolumny - elementy
	static int[][] kolejki=new int[10][10];
	static int[] szczyty=new int[10];
	static int[] poczatki=new int[10];
	
	public static void new_s(int i) {
		szczyty[i]=0;
		for(int k=0; k<10; k++) stosy[i][k]=0;
	}
	
	public static void push(int i, int e) {
		if(szczyty[i]==10) System.out.println("error: stack is full");
		else {
		stosy[i][szczyty[i]]=e;
		szczyty[i]++;
		}
	}
	
	public static void pop(int i) {
		if(szczyty[i]==0) System.out.println("error: stack is empty");
		else {
		stosy[i][szczyty[i]-1]=0;
		szczyty[i]--;
		}
	}
	
	public static void przeniesStos(int i, int j) {
			if(szczyty[j]<10 && szczyty[i]>0) {
			stosy[j][szczyty[j]]=stosy[i][szczyty[i]-1];
			stosy[i][szczyty[i]-1]=0;
			szczyty[i]--;
			szczyty[j]++;
			}
	}
	
	public static void delete_s(int i) {
		szczyty[i]=-1;
	}
	
	public static void print_s(int i) {
		if(szczyty[i]<1) System.out.println("empty");
		else {
			for(int k=0; k<szczyty[i]; k++) if(k<szczyty[i]-1) System.out.print(stosy[i][k]+" ");
			else System.out.print(stosy[i][k]);
			System.out.println();
		}
	}
	
}

Z góry dzięki!

0

Twoje rozwiązanie nie spełnia warunku, że stosy nie istnieją przed przyjęciem pierwszego polecenia.

0

Zmieniłem kod ale dalej ten sam problem, moj obecny kod:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


class main {

	public static void main (String[] args) throws IOException {
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		String slowo=" ";
		int p1=0;
		int p2=0;
		while(slowo!=null && slowo.length()>0) {
		slowo=br.readLine();
		if(slowo!=null) {
		p1=slowo.indexOf(" ");
		if(p1>-1) p2=slowo.indexOf(" ",p1+1);
		else p2=-1;
		if(slowo.contains("new_s")) {
			if(pierwsze) {
				stosy=new int[10][10];
				pierwsze=false;
			}
			new_s(Integer.parseInt(slowo.substring(p1+1)));
		}
		else if(slowo.contains("push")) push(Integer.parseInt(slowo.substring(p1+1,p2)),Integer.parseInt(slowo.substring(p2+1)));
		else if(slowo.contains("pop")) pop(Integer.parseInt(slowo.substring(p1+1)));
		else if(slowo.contains("stack->stack")) przeniesStos(Integer.parseInt(slowo.substring(p1+1,p2)),Integer.parseInt(slowo.substring(p2+1)));
		else if(slowo.contains("delete_s")) delete_s(Integer.parseInt(slowo.substring(p1+1)));
		else if(slowo.contains("print_s")) print_s(Integer.parseInt(slowo.substring(p1+1)));
		}
		}
	}
	
	static boolean pierwsze=true;
	static int[][] stosy; //wiersze - stosy, kolumny - elementy
	static int[][] kolejki; //pozniej sie zajme inicjalizacja tego, jak juz bede robil kolejki
	static int[] szczyty=new int[10];
	static int[] poczatki=new int[10];
	
	public static void new_s(int i) {
		szczyty[i]=0;
		for(int k=0; k<10; k++) stosy[i][k]=0;
	}
	
	public static void push(int i, int e) {
		if(szczyty[i]==10) System.out.println("error: stack is full");
		else {
		stosy[i][szczyty[i]]=e;
		szczyty[i]++;
		}
	}
	
	public static void pop(int i) {
		if(szczyty[i]==0) System.out.println("error: stack is empty");
		else {
		stosy[i][szczyty[i]-1]=0;
		szczyty[i]--;
		}
	}
	
	public static void przeniesStos(int i, int j) {
			if(szczyty[j]<10 && szczyty[i]>0) {
			stosy[j][szczyty[j]]=stosy[i][szczyty[i]-1];
			stosy[i][szczyty[i]-1]=0;
			szczyty[i]--;
			szczyty[j]++;
			}
	}
	
	public static void delete_s(int i) {
		szczyty[i]=-1;
	}
	
	public static void print_s(int i) {
		if(szczyty[i]<1) System.out.println("empty");
		else {
			for(int k=0; k<szczyty[i]; k++) if(k<szczyty[i]-1) System.out.print(stosy[i][k]+" ");
			else System.out.print(stosy[i][k]);
			//System.out.println();
		}
	}
	
}
0

Nie zam SPOJa, nie wiem czy tam analizują kod. Twój kod nadal nie spełnia warunków, np. polecenie new_s 4 ma utworzyć nowy pusty stos. U Ciebie pierwsze polecenie new_s tworzy 10 stosów. Może zamiast int[10][10] stosy użyj Stack[10] stosy.

0

Dzięki! Pomogło :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1