Bardzo, bardzo prosta implementacja stosu plus ćwiczenie – odwróć napis używając stosu. Do dzieła.

Stos:

class Stack {
 
    constructor(){  
        this.elements = []; 
    }
    push(element){ 
        this.elements.push(element) 
    }
    pop(){ 
        if(this.elements.length === 0) return "Underflow situation"; 
        else return this.elements.pop();
    }
    isEmpty(){ 
        if(this.elements.length > 0) return false;
        else return true;
    }
}

Odwracanie:

function reverse(str){
    
    let stack = new Stack();
     
    let i = 0;
    let reversedStr = "";
   
    while (i !== str.length) {
        stack.push(str.charAt(i));
        i++;
    }
  
    
    while (!stack.isEmpty()) {
        reversedStr += stack.pop();
    }
    
    return reversedStr;
}

console.log(reverse("hello world"));

Logika taka, że to co ląduje na stosie jako pierwsze, zleci z niego jako ostatnie. Zatem ostatnia litera jest pierwszą, która ze stosu spadnie.

Swoją drogą klasa wzięta z internetu, odrobinę ją sobie poprawimy:

class Stack {
 
    constructor(){  
        this.elements = []; 
    }
    push(element){ 
        this.elements.push(element) 
    }
    pop(){ 
        if(this.elements.length > 0)
            return this.elements.pop();
    }
    isEmpty(){ 
        return this.elements.length === 0;
    }
}

To tylko dla zobrazowania jak działa stos, bo funkcjonalność stosu (czyli to co wpadło ostatnie spada pierwsze, to co wpadło pierwsze spada ostatnie) możemy osiągnąć za pomocą listy oraz metod push i pop:

function reverse(str){
    
    let stack = [];
     
    let i = 0;
    let reversedStr = "";
   
    while (i !== str.length) {
        stack.push(str.charAt(i));
        i++;
    }
  
    
    while (stack.length > 0) {
        reversedStr += stack.pop();
    }
    
    return reversedStr;
}

console.log(reverse("hello world!"));
//!dlrow olleh