2016-12-22 12 views
2

Я пытаюсь понять сортировку элементов стека с использованием рекурсии, приведенной в http://www.geeksforgeeks.org/sort-a-stack-using-recursion/ Использование любых конструкций циклов, таких как while, for..etc не допускается. Мы можем использовать только следующие функции ADT на Stack S:Элементы сортировки стека с использованием javascript

is_empty (S): проверяет, пуст ли пуст или нет.

push (S): добавляет новый элемент в стек.

pop (S): удаляет верхний элемент из стека.

top (S): Возвращает значение верхнего элемента. Обратите внимание, что эта функция не удаляет элемент из стека. Я попытался ниже, но получаю ошибку

var stack = [-3, 14, 18, -5, 30]; 
 

 
function sortStack() { 
 
    if (stack.length > 0) { 
 
    temp = stack.pop(); 
 
    sortStack(); 
 
    sortedInsert(temp, stack); 
 
    } 
 
} 
 

 
function sortedInsert(element, stack) { 
 
    if (stack.length > 0 || element > stack[stack.length - 1]) { 
 
    stack.push(element); 
 
    } else { 
 
    temp = stack.pop(); 
 
    sortedInsert(element, stack); 
 
    stack.push(temp); 
 
    } 
 

 
} 
 

 
sortStack(); 
 

 
console.log(stack);

RangeError: Maximum call stack size exceeded 
at sortedInsert:12:22 
at sortedInsert:21:5 
at sortedInsert:21:5 
at sortedInsert:21:5 
at sortedInsert:21:5 
at sortedInsert:21:5 
+0

http://www.geeksforgeeks.org/sort-a-stack-using-recursion/ Я пытаюсь реализовать этот алгоритм в JavaScript –

+0

вам нужно использовать 'var' вместо этого, если вы используете глобальную переменную temp local. Кроме того, у вас путаный стек пуст, в стеке есть элементы в 'sortedInsert'. – Sylwester

ответ

2

С помощью JavaScript , локальные (скопированные) переменные должны быть объявлены как var, в противном случае они являются статическими. Без var до t в sortStack() t будет статичным и просто будет перезаписано каждым попом, оставив t = -3 для всех возвратов из sortStack(). Эта же проблема возникает с x в sortedInsert().

var stack = [-3, 14, 18, -5, 30]; 
 

 
function sortStack(s) { 
 
    if (s.length > 0) { 
 
    var t = s.pop(); 
 
    sortStack(s); 
 
    sortedInsert(s, t); 
 
    } 
 
} 
 

 
function sortedInsert(s, e) { 
 
    if (s.length == 0 || e > s[s.length - 1]) { 
 
    s.push(e); 
 
    } else { 
 
    var x = s.pop(); 
 
    sortedInsert(s, e); 
 
    s.push(x); 
 
    } 
 
} 
 

 
sortStack(stack); 
 

 
console.log(stack);

0
var stack = [-3, 14, 18, -5, 30]; 

function compare(a,b) { 

    return parseInt(a, 10) - parseInt(b, 10); 
    } 

stack.sort(compare); 

console.log(stack); 
+0

http://www.geeksforgeeks.org/sort-a-stack-using-recursion/ Я пытаюсь реализовать этот алгоритм в javascript –

+0

var stack = [-3, 14, 18, -5, 30]; функция bubbleSort (items) { var length = items.length; для (var i = (длина - 1); i> = 0; i--) { // Количество проходов для (var j = (длина - i); j> 0; j--) { // Сравните смежные позиции if (parseInt (items [j])

+0

Использование любых конструкций цикла, например while, for..etc не допускается.Мы можем использовать только следующие функции ADT на Stack S: is_empty (S): проверяет, пуст ли пуст или нет. push (S) \t: Добавляет новый элемент в стек. pop (S) \t: Удаляет верхний элемент из стека. top (S) \t: Возвращает значение верхнего элемента. Обратите внимание, что эта функция не удаляет элемент из стека. –

0

Если вы просто хотите, чтобы отсортировать массив, вы можете использовать sort() метод. Проверьте пример ниже:

var stack = [-3, 14, 18, -5, 30]; 
console.log(stack.sort()); 

Если вы хотите понять, как сортировать массив вручную, посмотрите на this ans (Примечание: ниже код копируется из той же анс):

var stack = [-3, 14, 18, -5, 30]; 

function arrSort(arr, subkey) { 
    //Default to 0 if no subkey is set 
    subkey = (subkey === undefined ? 0 : subkey); 

    var a = arr.slice(0), 
     b = [], x; 

    // For each section in the array, create an array containing whatever we are trying to sort by and our unique ID 
    for (x in a) { 
    b[x] = [a[x][subkey], x]; 
    } 

    b = b.sort(); 

    //Wipe out all the data that's currently in arr! 
    arr.splice(0, arr.length); 

    for (x in b) { 
    arr.push(a[b[x][1]]); 
    } 

    return arr; 
} 

// console.log(arrSort(stack, 0)); 
console.log(arrSort(stack)); 
+0

спасибо, но я пытаюсь понять эти алгоритмы, связанные со стеклом http://www.geeksforgeeks.org/sort-a-stack-using-recursion/ Я пытаюсь реализовать этот алгоритм в javascript, но мы не реализуем это в js –

+0

, мы можем определенно реализовать этот JS, проверим ссылку и попытаемся объяснить в моих ans. – Yogesh

 Смежные вопросы

  • Нет связанных вопросов^_^