1

Тема: Алгоритм Грехема(алгоритм побудови випуклої оболонки)

https://replace.org.ua/uploads/images/7111/3c74145751532655af8ff9f882038d72.png
Я можу отримати доступ до точки що знаходиться на вершині стека за допомогою функції stack.peek(). Моя проблема полягає в тому що я не можу реалізувати функцію NextToTop(S), яка повертає точку, розташовану в стеку S, на одну позицію нижче від верхньої точки. Допоможіть будь ласка вирішити цю проблему.

2 Востаннє редагувалося mamkin haker (24.01.2022 18:32:37)

Re: Алгоритм Грехема(алгоритм побудови випуклої оболонки)

3 Востаннє редагувалося Mirek7098 (03.12.2021 13:33:23)

Re: Алгоритм Грехема(алгоритм побудови випуклої оболонки)

Я добавив картинку з російським текстом бо на ній добре пояснюється те що я роблю. Щодо моїх напрацювань то у мене все реалізовано крім тієї проблеми яку я описав.

4

Re: Алгоритм Грехема(алгоритм побудови випуклої оболонки)

Ну, оскільки ви це виклали в алгоритмах і про мову нічого не сказали, а стек в цілому не має навіть peek, лише push і pop, то витягайте верхній елемент, інспектуйте другий і повертайте верхній на місце.
І так, завдання дуже погано читається, особливо іноземною.

5

Re: Алгоритм Грехема(алгоритм побудови випуклої оболонки)

package project;
import java.util.Stack;

public class Main
{
    static int rootX,rootY;
    public static void main(String[] args)
    {
        //int[] newX = {15,30,40,20,10};
        //int[] newY = {60,50,20,20,10};
        int[] newX = {400,800,1000,500,400,200};
        int[] newY = {100,100,300,300,500,300};
        int size = 6;
        
        int x = newX[0];
        int y = newY[0];
        for (int i = 0; i < size; i++) //знаходимо точку з найменшою y-координатою
        {
            if (y > newY[i] || (y == newY[i] && x > newX[i]))
            {
                x = newX[i];
                y = newY[i];
            }
        }
        rootX = x;
        rootY = y;
        System.out.println(x +" "+ y);
        int rootPosition = elementPositionInArray(newX, newY, size, rootX, rootY);// визначаємо позицію цієї точки
        changePlaces(newX, newY, 0, rootPosition);//ставимо цю точку на початок
        sortArray(newX, newY, size);
        System.out.println("After sort: ");
        for(int i = 0; i < size; ++i)
        {
            System.out.println("x = " + newX[i] + " y = " + newY[i]);
        }
        Stack<Integer> X = new Stack<>();
        Stack<Integer> Y = new Stack<>();
        for(int i = 0; i < 3; ++i)
        {
            X.add(newX[i]);
            Y.add(newY[i]);
        }
        for (int i = 3; i < size; ++i) //алгоритм Грехема
        {
            while (pointOrder(NextToTop(X), X.peek(), newX[i], NextToTop(Y), Y.peek(), newY[i]) != 2)
            {
                X.pop();
                Y.pop();
            }
            X.add(newX[i]);
            Y.add(newY[i]);
        }
        System.out.println("End: ");
        for(int i = 0; i < size; ++i)
        {
            //System.out.println("x = " + newX[i] + " y = " + newY[i]);
            System.out.println("x = " + X.get(i) + " y = " + Y.get(i));
        }
    }
    private static int NextToTop(Stack<Integer> S)
    {

    }
    public static void sortArray(int[] newX, int[] newY, int size)
    {
        for (int i = 1; i < size; ++i)
        {
            for (int y = i + 1; y < size; ++y)
            {
                int point1X = newX[i];
                int point1Y = newY[i];
                int point2X = newX[y];
                int point2Y = newY[y];
                int order = pointOrder(rootX, point1X, point2X,rootY, point1Y, point2Y);
                if (order == 0)
                {
                    if (distance(rootX, point2X, rootY, point2Y) <= distance(rootX, point1X, rootY, point1Y))
                    {
                        changePlaces(newX,newY, i, y);
                    }
                }
                else if (order == 1)
                {
                    changePlaces(newX,newY, i, y);
                }
            }
        }
    }
    public static int pointOrder(int point1X, int point2X, int point3X, int point1Y, int point2Y, int point3Y)
    {
        int area = (point2Y - point1Y) * (point3X - point2X) - (point2X - point1X) * (point3Y - point2Y);
        if (area > 0)
            return 1;
        else if (area < 0)
            return 2;
        return 0;
    }
    // знаходимо відстань між двома точками
    public static int distance(int point1X, int point2X, int point1Y, int point2Y)
    {
        int xLength = point1X - point2X;
        int yLength = point1Y - point2Y;
        return xLength * xLength + yLength * yLength;
    }
    public static void changePlaces(int[] newX, int[] newY, int positionA, int positionB)
    {
        int tmpX = newX[positionA];
        int tmpY = newY[positionA];
        newX[positionA] = newX[positionB];
        newY[positionA] = newY[positionB];
        newX[positionB] = tmpX;
        newY[positionB] = tmpY;
    }
    public static int elementPositionInArray(int[] newX, int[] newY, int size, int x, int y)
    {
        for (int i = 0; i < size; ++i)
        {
            if (newX[i] == x && newY[i] == y)
            {
                return i;
            }
        }
        return -1;
    }
}

6 Востаннє редагувалося Mirek7098 (03.12.2021 13:45:47)

Re: Алгоритм Грехема(алгоритм побудови випуклої оболонки)

Функція NextToTop має мені повернути  точку розташовану в стеку S, на одну позицію нижче від верхньої точки. Все інше в моїй програмі реалізовано і працює правильно

7 Востаннє редагувалося koala (03.12.2021 15:07:39)

Re: Алгоритм Грехема(алгоритм побудови випуклої оболонки)

Якщо вам ліньки pop-ати-push-ати, то візьміть замість стеку вектор. Воно всередині так і влаштовано:

Oracle написав:

https://docs.oracle.com/javase/7/docs/a … Stack.html

public class Stack<E>
extends Vector<E>

Add - це push, v.remove(v.size()-1) - pop, ну і індекси працюють.

Подякували: Mirek70981