首页 > 解决方案 > 从同一点恢复类方法而不使用 goto

问题描述

我正在制作逐步显示各种排序算法的程序。为此,每个算法都有自己的类和 nextStep 方法,它们应该只执行一次交换。问题是系统的实现,它允许从上一个 nextStep 调用结束的同一位置恢复排序。我试图通过使用 if 语句来解决这个问题,但没有成功。我发现的唯一工作方式是 goto。我正在寻找任何提示如何在不使用它的情况下解决此问题。

class QuickSort
{
    int r;
    int l;
    int i;
    int j;
    int top;
    int p;
    bool swap = true;
    int x;
    int recoveryController;
    std::vector<int> stack = std::vector<int>(1);
public:
    QuickSort(std::vector<int> numbers);
    void nextStep(std::vector<int> &numbers);
    
};

QuickSort::QuickSort(std::vector<int> numbers) {
    l = 0;
    r = numbers.size()-1;
    stack.resize((r - l + 2));
    top = -1;
    stack[++top] = l;
    stack[++top] = r;
    recoveryController = 0;
}

void QuickSort::nextStep(std::vector<int>& numbers)
{
    
    switch (recoveryController) {
    case 1:
        recoveryController = 0;
        goto return1;
        break;
    case 2:
        recoveryController = 0;
        goto return2;
        break;
    }
    while (top >= 0) {
        r = stack[top--];
        l = stack[top--];


        x = numbers[r];
        i = (l - 1);
        j = l;
        for (j; j <= r - 1; j++) {
            if (numbers[j] <= x) {
                i++;
                if (i != j) {
                    //Custom swap function
                    swapData(numbers[i], numbers[j]);
                    recoveryController = 1;
                    return;
                    return1:
                   
                    swap = false;          
                    
                }
               
            }
        }

        if (i + 1 != r) {
            //Custom swap function
            swapData(numbers[i + 1], numbers[r]);
            recoveryController = 2;
            return;
        return2:
           swap = false;
           

        }
        p=i + 1;
       

            if (p - 1 > l) {
                stack[++top] = l;
                stack[++top] = p - 1;
            }


            if (p + 1 < r) {
                stack[++top] = p + 1;
                stack[++top] = r;
            }
            if (swap)
            {
                return;
        }
        
    }
}

标签: c++quicksortgoto

解决方案


推荐阅读