用JS的class类模拟一个栈

什么是栈?

        遵循后进先出原则的数据结构。

基于数组的模拟的栈

我们先创造一个基于数组的栈,由于lifo原则,需要对元素的插入和删除做限制。

这次描述的栈有以下几个功能

push(element(s)):添加一个(或几个)新元素到栈顶。

pop():移除栈顶的元素,同时返回被移除的元素。

 peek():返回栈顶的元素,不对栈做任何修改(该方法不会移除栈顶的元素,仅仅返回它)。

 isEmpty():如果栈里没有任何元素就返回true,否则返回false。

 clear():移除栈里的所有元素。❑ size():返回栈里的元素个数。该方法和数组的length属性很类似。

class Stack {
    constructor() {
        this.items = []
    }
    // 增
    push(element) {
        this.items.push(element)
    }
    // 删
    pop(){
        return this.items.pop()
    }
    // 查 我们查看的正事栈顶部最后的元素
    peek() {
        return this.items[this.items.length -1];
    }
    // 判断你的栈是否为空
    isEmpty() {
        return this.items.length === 0;
    }
    // 获取你的栈的长度
    size() {
        return this.items.length;
    }
    // 清空你的栈里面所有的元素
    clear() {
        this.items=[]
    }
}

就这样一个最简单的模拟栈已经做好了,接下来我们体验一下它 

const stackList = new Stack();
// 判断这个栈是否为空
console.log(stackList.isEmpty()) // true
// 我们来添加元素
stackList.push('niubi_1')
stackList.push('niubi_2')
// 我们使用peek方法  返回栈顶的元素  会返回谁呢? 
// 会返回niubi_2 因为它是最后添加的 它在栈顶上  
console.log(stackList.peek()) // niubi_2

再实现一个基于对象模拟的栈

创建一个Stack类最简单的方式是使用一个数组来存储其元素。在处理大量数据的时候(这在现实生活中的项目里很常见),我们同样需要评估如何操作数据是最高效的。

在使用数组时,大部分方法的时间复杂度是O(n)。O(n)的意思是,我们需要迭代整个数组直到找到要找的那个元素,在最坏的情况下需要迭代数组的所有位置,其中的n代表数组的长度。如果数组有更多元素的话,所需的时间会更长。

另外,数组是元素的一个有序集合,为了保证元素排列有序,它会占用更多的内存空间。如果我们能直接获取元素,占用较少的内存空间,并且仍然保证所有元素按照我们的需要排列,那不是更好吗?对于使用JavaScript语言实现栈数据结构的场景,我们也可以使用一个JavaScript对象来存储所有的栈元素,保证它们的顺序并且遵循LIFO原则。我们来看看如何实现这样的行为。

class Stack {
    constructor() {
        this.count = 0;
        this.items = {}
    }
    // 这里和数组的数据结构就不一样了  
    // 使用key和value
    push(element) {
        this.items[this.count] = element;
        this.count++;
    }
    size() {
        return this.count;
    }
    // 特别注意 再和数字比对时一定要用===
    isEmpty() {
        return this.count === 0
    }
    pop() {
        if(this.isEmpty()) return undefined;
        this.count-- ;
        // 将你要删除的元素先保存下来
        const result = this.items[this.count]
        delete this.items[this.count]
        return result
    }
    peek() {
        if(this.isEmpty() )return undefined;
        return this.items[this.count -1]
    }
    clear() {
        this.items ={}
        this.count = 0 
    }
}
const stackObj =new Stack()
stackObj.push(1)
stackObj.push(2)
console.log(stackObj.items) // { '0': 1, '1': 2 }
console.log(stackObj.peek())  // 2 
stackObj.pop() //执行删除栈顶元素
console.log(stackObj.items) //{ '0': 1 }

数组和对象风格的栈的比对

       数组栈我们再计算时,复杂度均为O(n) 因为我们再找到某一项元素时候 因为是数组 所以可能会遍历一遍,因此性能会变差

     对象创建的方法的复杂度均为O(1),代表我们可以直接找到目标元素并对其进行操作

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一个基于模板实现的的示例代码: ```c++ template <typename T> class Stack { private: T* stackArray; // 存储元素的数组 int top; // 顶元素的下标 int capacity; // 的容量 public: // 构造函数,创建一个 Stack(int capacity = 10) { this->capacity = capacity; stackArray = new T[capacity]; top = -1; } // 析构函数,释放内存 ~Stack() { delete[] stackArray; } // 判断是否为空 bool isEmpty() { return top == -1; } // 判断是否已满 bool isFull() { return top == capacity - 1; } // 入操作 void push(T element) { if (isFull()) { cout << "Stack overflow!" << endl; return; } stackArray[++top] = element; } // 出操作 T pop() { if (isEmpty()) { cout << "Stack underflow!" << endl; return T(); } return stackArray[top--]; } // 获取顶元素 T getTop() { if (isEmpty()) { cout << "Stack is empty!" << endl; return T(); } return stackArray[top]; } // 获取的元素个数 int size() { return top + 1; } }; ``` 这个模板实现了一个基本的数据结构,其中元素型为模板参数T,可以根据实际需要进行实例化。使用示例: ```c++ Stack<int> s(5); // 创建一个容量为5的整型 s.push(1); s.push(2); s.push(3); cout << s.pop() << endl; // 输出3 cout << s.getTop() << endl; // 输出2 cout << s.size() << endl; // 输出2 ``` 注意,这里的容量是在构造函数中指定的,如果不指定则默认为10。在入操作中,如果已满则会输出一条错误信息并返回。在出操作中,如果为空则同样会输出一条错误信息并返回一个默认值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值