diff --git a/Data-Structures/Stack/StackES6.js b/Data-Structures/Stack/StackES6.js new file mode 100644 index 0000000000..6e54bab842 --- /dev/null +++ b/Data-Structures/Stack/StackES6.js @@ -0,0 +1,68 @@ +/* Stack data-structure. It's work is based on the LIFO method (last-IN-first-OUT). + * It means that elements added to the stack are placed on the top and only the + * last element (from the top) can be reached. After we get access to the last + * element, he pops from the stack. + * This is a class-based implementation of a Stack. It provides functions + * 'push' - to add an element, 'pop' - to remove an element from the top. + * Also it implements 'length', 'last' and 'isEmpty' properties and + * static isStack method to check is an object the instance of Stack class. + */ + +// Class declaration +class Stack { + constructor () { + this.stack = [] + this.top = 0 + } + + // Adds a value to the end of the Stack + push (newValue) { + this.stack.push(newValue) + this.top += 1 + } + + // Returns and removes the last element of the Stack + pop () { + if (this.top !== 0) { + this.top -= 1 + return this.stack.pop() + } + throw new Error('Stack Underflow') + } + + // Returns the number of elements in the Stack + get length () { + return this.top + } + + // Returns true if stack is empty, false otherwise + get isEmpty () { + return this.top === 0 + } + + // Returns the last element without removing it + get last () { + if (this.top !== 0) { + return this.stack[this.stack.length - 1] + } + return null + } + + // Checks if an object is the instance os the Stack class + static isStack (el) { + return el instanceof Stack + } +} +const newStack = new Stack() +console.log('Is it a Stack?,', Stack.isStack(newStack)) +console.log('Is stack empty? ', newStack.isEmpty) +newStack.push('Hello world') +newStack.push(42) +newStack.push({ a: 6, b: 7 }) +console.log('The length of stack is ', newStack.length) +console.log('Is stack empty? ', newStack.isEmpty) +console.log('Give me the last one ', newStack.last) +console.log('Pop the latest ', newStack.pop()) +console.log('Pop the latest ', newStack.pop()) +console.log('Pop the latest ', newStack.pop()) +console.log('Is stack empty? ', newStack.isEmpty)