Алгоритм удаления значений в очереди C# - PullRequest
0 голосов
/ 27 января 2020

Я хочу удалить элементы из очереди, я могу удалить значения и затем добавить их обратно, но когда я пытаюсь удалить значения, он заменяет старые значения новыми значениями. например, если я добавляю значения 1,2,3,4,5,6,7,8,9,10, а затем удаляю значения 1 и 2 и добавляю значения 11 и 12. Когда я начинаю удалять остальные значения, которые он пропускает значения 9 и 10, как 11 и 12 заменил их, например, удалить значения 3,4,5,6,7,8, 11, 12, но я не хочу, чтобы он показывал удаленные значения, 3 , 4, 5, 6, 7, 8, 9, 10, 11, 12. Как я могу это сделать?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace queue
{
class Program
{
    static void Main(string[] args)
    {

        int max = 10;
        int[] a;
        a = new int[max];
        int input; //user input
        int front = 0;
        int rear = 0;
        int j = 0;

        do
        {
            Console.WriteLine
                 ("What do you want to do?");

            Console.WriteLine();

            Console.WriteLine("Add = 1");
            Console.WriteLine("Dequeue = 2");
            Console.WriteLine("Exit = 3");

            Console.WriteLine();

            input = int.Parse(Console.ReadLine());

            Console.WriteLine();

            if (input == 1)
            {
                Console.WriteLine("Add");

                if (rear != max)
                {
                    Console.WriteLine("What do you want to add?");
                    int v; //value

                    v = int.Parse(Console.ReadLine());
                    a[j] = v;
                    j++;
                    rear++;

                }

                else
                    Console.WriteLine("Queue is full");
            }

            else if (input == 2)

            {
                Console.WriteLine();
                Console.WriteLine("Dequeue");

                if (rear != 0)
                {

                    Console.WriteLine("The dequeue value is:" + a[front++]);
                    rear--;
                    j--;
                }

                else

                    Console.WriteLine(" Queue is empty");
            }

            else if (input == 3)
            {
                Console.WriteLine("Exit program");
                Console.WriteLine();

            }

            else

            {
                Console.WriteLine("Enter option");
                Console.WriteLine();
            }

        } while (input != 'X');

    }
}
}

Ответы [ 2 ]

2 голосов
/ 27 января 2020

Вот как это сделать, используя Queue<T>, некоторые оптимизации, лучшую читаемость и т. Д.

class Program
{
    static void Main(string[] args)
    {
        int maxListLength = 10;
        Queue<int> numbers = new Queue<int>(maxListLength);
        int inputInteger = 0;
        string input = string.Empty;

        while (true)
        {
            Console.WriteLine("What do you want to do?\n\nAdd = 1\nDequeue = 2\nExit = 3\n");
            input = Console.ReadLine();

            if (int.TryParse(input, out int convertedInput))
            {
                inputInteger = convertedInput;
            }
            else
            {
                Console.WriteLine("Input must be an integer");
                continue;
            }

            switch (inputInteger)
            {
                case 1:
                    Console.WriteLine("You choose to Add");
                    if (numbers.Count != maxListLength)
                    {
                        Console.WriteLine("What value do you want to add?");
                        input = Console.ReadLine();

                        if (int.TryParse(input, out convertedInput))
                        {
                            inputInteger = convertedInput;
                            numbers.Enqueue(inputInteger);
                        }
                        else
                        {
                            Console.WriteLine("Input must be an integer");
                            continue;
                        }
                    }
                    else
                    {
                        Console.WriteLine("The Queue is full");
                    }
                    break;
                case 2:
                    Console.WriteLine("You chose to Dequeue");
                    if (numbers.Count > 0)
                    {
                        Console.WriteLine("The dequeue value is: " + numbers.Dequeue());
                    }
                    else
                    {
                        Console.WriteLine("The Queue is empty");
                    }
                    break;
                case 3:
                    Console.WriteLine("Exit program\nPress a button to exit");
                    Console.ReadLine();
                    return;
                    break;
                default:
                    Console.WriteLine("Input must be 1, 2 or 3");
                    continue;
                    break;
            }
        }
    }
}
0 голосов
/ 27 января 2020

Если вы решите использовать массив, вы должны переместить все элементы после первого элемента при удалении из очереди, что не очень хорошая идея. Так что, если вы решите использовать список, было бы проще, и ваша программа изменилась с использованием списка.

using System;
using System.Collections.Generic;

namespace queue
{
    class Program
    {
        static void Main(string[] args)
        {

            int max = 10;
            var items = new List<int>();
            int b; //user input
            int nbElements = 0;

            do
            {
                Console.WriteLine
                     ("What do you want to do?");

                Console.WriteLine();

                Console.WriteLine("Add = 1");
                Console.WriteLine("Dequeue = 2");
                Console.WriteLine("Exit = 3");

                Console.WriteLine();

                b = int.Parse(Console.ReadLine());

                Console.WriteLine();

                if (b == 1)
                {
                    Console.WriteLine("You choose to Add");

                    if (nbElements != max)
                    {
                        Console.WriteLine("What value do you want to add?");
                        int v; //value

                        v = int.Parse(Console.ReadLine());
                        items.Add(v);
                        nbElements++;

                    }

                    else
                    {
                        Console.WriteLine("The Queue is full");
                        foreach (var item in items)
                        {
                            Console.WriteLine(item);
                        }
                    }

                }

                else if (b == 2)

                {
                    Console.WriteLine();
                    Console.WriteLine("You chose to Dequeue");

                    if (nbElements != 0)
                    {

                        Console.WriteLine("The dequeue value is:" + items[0]);
                        items.RemoveAt(0);
                        nbElements--;
                    }

                    else

                        Console.WriteLine(" Queue is empty");
                }

                else if (b == 3)
                {
                    Console.WriteLine("Exit program");
                    Console.WriteLine();
                    Console.WriteLine("Press Enter to exit");
                    Console.ReadLine();
                    Environment.Exit(0);

                }

                else

                {
                    Console.WriteLine("Enter a valid option");
                    Console.WriteLine();
                }

            } while (b != 'X');

        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...