Wczytywanie liczb z ciągu znaków

Wczytywanie liczb z ciągu znaków
Cisi204
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 232
0

O to chodziło tak ?

Kopiuj
void displayQueue() {
  if (isempty())
    cout << "Print: Queue is empty\n";
  else {
	
      cout << "Print:";
    for (int i = front; i <= rear; i++){
      cout <<" "<< A[i];
  }

  }
  cout<<"\n";
}
Delor
  • Rejestracja: dni
  • Ostatnio: dni
0
Cisi204 napisał(a):

O to chodziło tak ?

Nie. Teraz dodając do kolejki zwiększasz wartość rear. Po dodaniu 10 elementów kończy ci się miejsce w tablicy.
Wymyśl sposób na "odzyskiwanie" w niej miejsca.

Cisi204
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 232
0

Chłopaki powiedzcie mi mi na czym polega mój problem w tej funkcji bo sam nie wiem wpisując Enqueue 1 ,Enqueue 2 wypisują mi się liczby 1 2.Uzytkownik Delor zapytał mnie co zrobić jesli w tablicy NIE MA już miejsca, należy po prostu usunąć element . Oto moja funkcja :

Kopiuj
void displayQueue() {
  if (isempty()){
    cout << "Print: Queue is empty\n";
  }
  else {
   cout << "Print:";
   for (int i = front; i <= rear; i++)
   cout <<" "<< A[i];
  }
  

}
Delor
  • Rejestracja: dni
  • Ostatnio: dni
0
Cisi204 napisał(a):

... Uzytkownik Delor zapytał mnie co zrobić jesli w tablicy NIE MA już miejsca, należy po prostu usunąć element .

To nic nie da. Dopisujesz na koniec listy. Usuwasz elementy z początku.
Podając dane z przykładu problem napotkasz wpisując linię:

Kopiuj
Enqueue 12
Cisi204
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 232
0

Dopiero teraz widzę że gdy chcę dodać liczbę wyskakuje komunikat queue is full jak to naprawić?

Delor
  • Rejestracja: dni
  • Ostatnio: dni
0

Rozwiązań jest kilka.

Niewłaściwe: zwiększenie rozmiaru tablicy (problem wystąpi później).
Nieefektywne: przenoszenie danych przy usuwaniu elementu.
Poprawne: "zawijanie" zmiennych rear/front na tablicy (gdy dotrą do końca tablicy to przechodzą na początek) i uwzględnienie tego we wszystkich funkcjach operujących na tych zmiennych.

Cisi204
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 232
0

Witam w nowym dniu , analizując swój kod stwierdziłem że warunek na queue is full nie ma sensu gdyż usuwa rzeczy z kolejki robiąc front++ oto modyfikacja :

Kopiuj
void enqueue(int value) {
  if (rear == SIZE)
    cout << "Error: queue is full\n";
  else {
    if (front == -1)
      front = 0;
    rear++;
    A[rear] = value;
    cout << "--->\n";
  }
}

Metodę dequeue postanowiłem zostawić w starej formie , jeśli widzicie błędy powiedzcie co jest nie tak

Kopiuj
void dequeue() {
  if (isempty()){
    cout << "Error: queue is empty\n";
    }
  else if (front == rear){
     cout << A[front] << "\n";
    front = -1;
    rear =  -1;
    }
  else{
    front++;
     cout << A[front - 1] << "\n";
  }
}

Metodę Display zmodyfikowałem tak:

Kopiuj
void displayQueue() {
  if (isempty())
    cout << "Print: Queue is empty\n";
  else {
      cout << "Print:";
    for (int i = front; i <= rear; i++)
      cout <<" "<< A[i];
  }
else{
for(int j=rear;j<=front;j++)
cout<<" " << A[j];
}
  cout << " \n";
}
lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5025
0

Takie rzeczy najlepiej wsadzić do klasy:

Kopiuj
#include <iostream>
#include <string>

class Queue{
	int *a;
	int size;
	int end;
	
	private: void move(){ // move whole array left by one, effective, but not efficient:)
		for (int i = 0; i < size - 1; i++)
			a[i] = a[i+1];
	}
	
	public: 
	
	Queue(){
		a = new int[10];
		size = 0;
		end = 0;
	}
	
	bool isEmpty() {return size == 0;}
	
	void enqueue(int val){
		if (size == 10) {
			std::cout << "Error: queue is full\n";
		}
		else {
			a[end++] = val;
			size++;
			std::cout << "--->\n";
		}
	}
	
	void dequeue(){
		if (isEmpty()){
			std::cout << "Error: queue is empty\n";
		}
		else {
			std::cout << a[0] << "\n";
			move();
			end--;
			size--;
		}
	}
	
	void printQueue(){
		if (isEmpty()) {
			std::cout << "Print: Queue is empty\n";
		}
		else {
			std:: cout << "Print:";
			for (int i = 0; i < end; i++)
				std::cout << " "<< a[i];
			std::cout << "\n";
		}
	}

};

int main(){
	Queue * queue = new Queue();
	std::string str;
    while (std::cin >> str) {
        int value;
        if (str == "Enqueue") {
            if (std::cin >> value) {
                queue->enqueue(value);
            }
        }
        else if (str == "Dequeue"){
			queue->dequeue();
		}
		else if (str == "Print"){
			queue->printQueue();
		}
    }
return 0;	
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.