TypeScript 如何使用数组创建一个堆栈

TypeScript 如何使用数组创建一个堆栈

栈是一个基于后进先出的数据结构,意思是后进先出。简而言之,它说你在堆栈中最后加入的任何元素都会从堆栈中先出来。

有一些基本的操作,用户可以在堆栈上执行。例如,我们可以向堆栈推送一个元素,从堆栈中弹出一个元素,或者从堆栈中偷看一个元素。

在这里,用户可以看到堆栈的基本方法,我们也将在本教程中创建堆栈时实现这些方法。

堆栈方法

  • Push() – 它允许我们在堆栈中添加一个元素。

  • Pop() – 它允许从堆栈中移除最后一个元素。

  • Peek() – 它从堆栈中返回最上面的元素,但不删除它。

  • isEmpty() – 它根据堆栈是否为空返回布尔值。

  • isFull() – 它根据堆栈是否已满返回真或假的值。

  • Size() – size()方法返回代表堆栈大小的数字值。

  • printStack() – printStack()方法打印所有堆栈值。

实现堆栈类

现在,我们将在TypeScript中使用类和接口实现一个堆栈。用户可以按照下面的步骤来创建一个堆栈。

第1步 – 创建一个包含所有堆栈方法的接口。

interface stackInterface<dataType> {
   push(dataItem: dataType): void;
   pop(): dataType | null | undefined;
   peek(): dataType | null;
   isEmpty(): boolean;
   isFull(): boolean;
   size(): number;
   printStack(): void;
}

在上面的代码中,用户可以看到,我们已经在stackInterface命名的接口中声明了所有的堆栈方法,以及它们的参数和返回类型。我们将在堆栈类中实现上述接口。

第2步 – 现在,我们需要创建一个StackClass并定义上述接口中声明的所有方法。同时,创建data和stackSize私有成员,分别用于存储堆栈元素和堆栈的最大尺寸。

第3步 – 之后,创建一个构造函数来初始化栈的最大尺寸,如下所示。

constructor(size: number) {
   this.stackSize = size;
}

第4步 – 现在,我们需要为堆栈实现push()方法。

push(dataItem: dataType): void {
   if (this.data.length === this.stackSize) {
      // throw error
   }
   this.data.push(dataItem);
}

在上面的代码中,我们正在检查堆栈是否已满。如果堆栈已满,则抛出错误;否则,使用Array.push()方法将该元素推送到数组中。

第5步 – 接下来,实现堆栈的pop()方法。

pop(): dataType | null | undefined {
   return this.data.pop();
}

在上面的代码中,我们使用Array.pop()方法来删除数组中最后一个索引的元素。

第6步 – 接下来,在StackClass中实现peek()方法。

peek(): dataType | null {
   return this.data[this.size() - 1];
}

在上面的代码中,我们正在访问数组的最后一个元素并将其返回。

第7步 – 为StackClass实现isEmpty()方法。

isEmpty(): boolean {
   return this.data.length <= 0;
}

我们用数组的长度方法来检查堆栈是否为空。

第8步 – 用户可以按照下面的语法来定义isFull()方法。

isFull(): boolean {
   let result = this.data.length >= this.stackSize;
   return result;
}

我们比较了数组的长度和stackSize属性的值,以检查堆栈是否已满。

第9步 – 用户可以使用下面的代码来实现StackClass的size()方法。

size(): number {
   return this.data.length;
}

堆栈的大小与数组的大小相似,为了得到数组的大小,我们可以使用长度属性。

第10步 – 接下来,定义printStack()方法来打印堆栈的元素。

printStack(): void {
    
   this.data.forEach((dataItem) => {
      // print dataItem
   });
}

在上面的代码中,我们遍历数据数组并打印所有数组的值。

示例

在下面的例子中,我们已经创建了StackClass,它实现了stackInterface。另外,用户可以看到我们如何用自定义的数据类型创建一个堆栈。

下面例子中的StackClass包含了上述所有方法的实现。之后,我们创建了StackClass的对象,并使用数字作为数据类型。之后,我们使用StackClass的各种方法来对堆栈进行不同的操作。

interface stackInterface<dataType> {
   push(dataItem: dataType): void;
   pop(): dataType | null | undefined;
   peek(): dataType | null;
   isEmpty(): boolean;
   isFull(): boolean;
   size(): number;
   printStack(): void;
}

class StackClass<dataType> implements stackInterface<dataType> {
   private data: Array<dataType> = [];
   private stackSize: number = 0;

   constructor(size: number) {
      this.stackSize = size;
   }

   push(dataItem: dataType): void {
      if (this.data.length === this.stackSize) {
         throw Error(
            "You can't add more elements to stack as stack storage is full!"
         );
      }
      this.data.push(dataItem);
   }

   pop(): dataType | null | undefined {
      let element = this.data.pop();
      return element;
   }

   peek(): dataType | null {
      let element = this.data[this.size() - 1];
      return element;
   }
   isEmpty(): boolean {
      let result = this.data.length <= 0;
      return result;
   }
   isFull(): boolean {
      let result = this.data.length >= this.stackSize;
      return result;
   }
   size(): number {
      let len = this.data.length;
      return len;
   }
   printStack(): void {
      console.log("All stack values are printed below!");
      this.data.forEach((dataItem) => {
         console.log(dataItem);
      });
   }
}

const newstack = new StackClass<number>(5);
newstack.push(10);
newstack.push(12);
newstack.push(897);
newstack.push(54);
newstack.push(14);

console.log("The peek element of the stack is " + newstack.peek());
console.log("Is stack full? " + newstack.isFull());
console.log("The last removed element from the stack is " + newstack.pop());
console.log("The size of the stack is " + newstack.size());
console.log("Is stack empty? " + newstack.isEmpty());
newstack.printStack();
var StackClass = /** @class */ (function () {
   function StackClass(size) {
      this.data = [];
      this.stackSize = 0;
      this.stackSize = size;
   }
   StackClass.prototype.push = function (dataItem) {
      if (this.data.length === this.stackSize) {
         throw Error("You can't add more elements to stack as stack storage is full!");
      }
      this.data.push(dataItem);
   };
   StackClass.prototype.pop = function () {
      var element = this.data.pop();
      return element;
   };
   StackClass.prototype.peek = function () {
      var element = this.data[this.size() - 1];
      return element;
   };
   StackClass.prototype.isEmpty = function () {
      var result = this.data.length <= 0;
      return result;
   };
   StackClass.prototype.isFull = function () {
      var result = this.data.length >= this.stackSize;
      return result;
   };
   StackClass.prototype.size = function () {
      var len = this.data.length;
      return len;
   };
   StackClass.prototype.printStack = function () {
      console.log("All stack values are printed below!");
      this.data.forEach(function (dataItem) {
         console.log(dataItem);
      });
   };
   return StackClass;
}());
var newstack = new StackClass(5);
newstack.push(10);
newstack.push(12);
newstack.push(897);
newstack.push(54);
newstack.push(14);
console.log("The peek element of the stack is " + newstack.peek());
console.log("Is stack full? " + newstack.isFull());
console.log("The last removed element from the stack is " + newstack.pop());
console.log("The size of the stack is " + newstack.size());
console.log("Is stack empty? " + newstack.isEmpty());
newstack.printStack();

输出

上述代码将产生以下输出 —

The peek element of the stack is 14
Is stack full? true
The last removed element from the stack is 14
The size of the stack is 4
Is stack empty? false
All stack values are printed below!
10
12
897
54

在本教程中,我们学习了如何从头开始创建一个堆栈。我们从头开始实现了堆栈的各种方法。同时,用户可以创建任何数据类型的堆栈。甚至用户可以创建 “任何 “数据类型的堆栈并添加多种数据类型的元素。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

TypeScript 教程