O to chodziło tak ?
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";
}
O to chodziło tak ?
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";
}
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.
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 :
void displayQueue() {
if (isempty()){
cout << "Print: Queue is empty\n";
}
else {
cout << "Print:";
for (int i = front; i <= rear; i++)
cout <<" "<< A[i];
}
}
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ę:
Enqueue 12
Dopiero teraz widzę że gdy chcę dodać liczbę wyskakuje komunikat queue is full jak to naprawić?
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.
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 :
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
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:
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";
}
Takie rzeczy najlepiej wsadzić do klasy:
#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;
}