Какова стоимость заднего и переднего счетчик реализацию выбора начала очереди? -1 или 0 или 1?


Что-то не так с этим реализация очереди с помощью массива?

Я начал передний = заднего = -1.

Некоторые ссылки, как правило, начинаются стойка = 0 вроде этого:введите ссылку здесь описание

Я думаю, если начинается с 0, исходный код становится громоздким.

#include <stdio.h>
#include<ctype.h>
#define SIZE 5

int queue[SIZE] = {0};
int front = -1;
int rear = -1;

void PrintQueue()
{
    int i=0;

    if(!IsEmpty())
    {
        for(i=front+1 ; i<=rear ; i++)
        {
            printf("%d, ", queue[i]);
        }
        printf("\n");
    }
    else
    {
        printf("Queue is empty.\n");
    }
}

int IsEmpty()
{
    if(front==rear)
    {
        front = rear = -1;
        return 1;
    }
    else
    {
        return 0;
    }
}

void Enque(int value)
{
    if(rear<SIZE-1)
    {
        ++rear;
        queue[rear] = value;
    }
    else
    {
        printf("Queue overflow!\n");
    }
}

int Dequeue()
{
    int ret = 0;
    if(!IsEmpty())
    {
        ++front;
        ret = queue[front];
    }
    else
    {
        printf("Queue underflow!\n");
        ret = -99;
    }

    return ret;
}

main()
{
    int value = 0;
    int menu = 0;

    while(1)
    {
        printf("Menu\n");
        printf("--------\n");
        printf("1. Enque\n");
        printf("2. Deque\n");
        printf("3. IsEmpty\n");
        printf("4. Print\n");
        printf("5. Clrscr\n");
        printf("6. Exit\n");
        scanf(" %d", &menu);

        switch(menu)
        {
        case 1:
            printf("Enter an element : ");
            scanf(" %d", &value);
            Enque(value);
            break;

        case 2:
            printf("Dequed, %d.\n", Dequeue());
            break;

        case 3:
            if(IsEmpty())printf("Queue is empty.\n");
            else printf("Que has some values.\n");
            break;

        case 4:
            PrintQueue();
            break;

        case 5:
            system("cls");
            break;

        case 6:
            exit(0);
            break;
        }
    }
}


8791
1
задан 6 июня 2011 в 07:06 Источник Поделиться
Комментарии
1 ответ

Большинство реализаций очереди использовать фронт , чтобы указать на главный элемент очереди и сзади , чтобы указывать на первый пустой элемент в задней части очереди:

front       rear
v v
[1][2][3][4][ ][ ]

Внедрение их указывает один из элементов предыдущего.

Чтобы изменить свой код, чтобы работать, как это было бы изменить передний/задний, чтобы начать с 0 и потом обращать свой инкремент/читать:

void Enqueue(int value)
{
if(rear<SIZE-1)
{
queue[rear] = value;
++rear;
}
else
{
printf("Queue overflow!\n");
}
}

Комментарий:

Ваш isEmpty возвращает функция имеет побочный эффект сброса очереди. Название не отражает это; похоже, надо просто проверить, является ли очередь пустой. Нет действительно ничего неправильно с этим. Прагматично, такая операция должна быть прозрачной. Однако, я бы поставил комментарий там, с описанием побочных эффектов.

Вы могли бы также реализовать циркулярно связан очереди , в которой вы вставляете элементов (концептуальных) кольцо. В основном, когда Вы дойдете до конца массива, вы начинаете снова вводить в начале. Однако, это означает, что когда передний = задний буфер может быть полным или пустым. Просто проверить задние + 1 , чтобы увидеть, если она пуста.

Ох, и пожалуйста, заклинание "очереди" и его варианты правильно...это действительно давало мне покоя :)

1
ответ дан 6 июня 2011 в 01:06 Источник Поделиться