栈内元素排序问题


昨天笔试某知名IT企业,最后面一道编程题,题目如下:
完成函数StackSort,传入stack,返回排序后的stack,可以使用的数据结构只有stack,方法限于pop() top() push() isempty() is full(),先给出算法思想,然后完成代码。

…………………………………………………………………………………………………………
昨天我再考场上最后时间不够,就用两个辅助栈,每次找出最大元素入栈,然后再找次大元素,依次类推,没来得及写代码,不知道有更好的思路没有,只能用栈,我开始想直接把数据读入数组,然后排序,然后入栈,此方法不行。

数据结构与算法

小兰·魇魅 9 years, 1 month ago

可以用快排啊


 Stack Qsort(Stack stk)
{
    Stack result = new Stack();

    if (stk.isEmpty()) {
        return result;
    }

    Elem spliter = stk.top();

    stk.pop();

    Stack s1 = new Stack(), s2 = new Stack();

    while (!stk.isEmpty()) {
        Elem e = stk.top();
        stk.pop();
        if (e < spliter) {
            s1.push(e);
        } else {
            s2.push(e);
        }
    }

    s1 = Qsort(s1);
    s2 = Qsort(s2);

    Stack s1Rev = new Stack(), s2Rev = new Stack();

    while (!s1.isEmpty()) {
        Elem e = s1.top();
        s1.pop();
        s1Rev.push(e);
    }

    while (!s2.isEmpty()) {
        Elem e = s2.top();
        s2.pop();
        s2Rev.push(e);
    }

    while (!s1Rev.isEmpty()) {
        Elem e = s1Rev.top();
        s1Rev.pop();
        result.push(e);
    }

    result.push(spliter);

    while (!s2Rev.isEmpty()) {
        Elem e = s2Rev.top();
        s2Rev.pop();
        result.push(e);
    }

    return result;
}

qscgul answered 9 years, 1 month ago

思路:假设一个stack已经排好。新增一个元素,只要把该元素插入到恰当的位置即可。
方法:递归

其实任何一种排序算法都可以,因为总有办法访问到stack里任何一个元素。

武藤遊戲F answered 9 years, 1 month ago

Your Answer