stack和queue类的模拟实现

stack和queue类的模拟实现

1、关于设计模式

设计模式(Design Patterns)是解决特定问题的经验性的通用解决方案,它是对软件开发过程中反复出现的问题、解决方案和经验的总结和抽象。设计模式不是具体的代码实现,而是提供了一种描述问题和解决方案的模板,可以应用到不同的场景中

①适配器模式

已有的东西封装转换出想有的东西

适配器设计模式是一种软件设计模式,它用于将一个类的接口转换成另一个客户端代码所期望的接口。它允许原本不兼容的类能够合作工作。适配器模式可以被认为是一种桥接模式,因为它连接了两个不同的接口,使得它们能够协同工作。

适配器模式通常用于以下场景:

  1. 当需要使用一个已经存在的类,但它的接口与应用程序所需要的接口不匹配时。
  2. 当需要重用一个已经存在的类,但其接口不符合客户端的需求时。
  3. 当需要创建一个能够与多个类或对象协同工作的类时。

适配器模式通常分为两种类型:对象适配器和类适配器。对象适配器使用组合将一个对象包装起来以适配另一个接口,而类适配器则通过继承一个类并实现目标接口来实现适配。

使用适配器模式可以提高代码的复用性和灵活性,同时也可以降低系统的耦合度。不过,需要注意的是,适配器模式的使用可能会增加代码的复杂度和开销,因此需要权衡利弊并谨慎使用。

②迭代器模式

不暴露底层细节,封装后提供统一的方式访问容器

迭代器设计模式是一种行为型设计模式,它允许客户端逐个遍历一个聚合对象的元素,而不必暴露该对象的内部表示

该模式由以下组件组成:

  1. 迭代器(Iterator):定义访问和遍历聚合对象元素的接口。
  2. 具体迭代器(ConcreteIterator):实现迭代器接口,追踪聚合对象的当前位置,并能够返回正确的元素。
  3. 聚合对象(Aggregate):定义创建迭代器对象的接口。
  4. 具体聚合对象(ConcreteAggregate):实现聚合对象接口,返回一个能够遍历自己元素的迭代器对象。

使用迭代器模式,可以将遍历聚合对象的过程封装到迭代器对象中,从而使客户端与聚合对象的内部结构解耦。此外,迭代器模式也可以让我们在不同的聚合对象上使用相同的迭代器接口,从而提高代码复用性。


2、模拟实现

下面是使用适配器模式,基于已经存在的vector类,对stack进行模拟实现的代码:

#include <iostream>
#include <vector>

using namespace std;

// 定义一个适配器类,将vector适配为stack
template <typename T>
class MyStack {
    
    
private:
    vector<T> data;

public:
    // 入栈操作
    void push(T item) 
    {
    
    
        data.push_back(item);
    }

    // 出栈操作
    void pop() 
    {
    
    
        data.pop_back();
    }

    // 获取栈顶元素
    T top() 
    {
    
    
        return data.back();
    }

    // 判断栈是否为空
    bool empty()
    {
    
    
        return data.empty();
    }

    // 获取栈的大小
    int size() 
    {
    
    
        return data.size();
    }
};

在上面的代码中,我们定义了一个适配器类MyStack,将vector适配为stack。MyStack类中包含了push、pop、top、empty、size等操作,这些操作实际上都是通过调用vector类的相应方法来实现的。在main函数中,我们创建了一个MyStack对象,并进行了一些入栈、出栈、获取栈顶元素等操作,这些操作都是通过MyStack类来实现的。


下面是使用适配器模式,基于已经存在的list类,对queue进行模拟实现的代码:

#include <iostream>
#include <list>

using namespace std;

// 定义一个适配器类,将list适配为queue
template <typename T>
class MyQueue {
    
    
private:
    list<T> data;

public:
    // 入队操作
    void push(T item) {
    
    
        data.push_back(item);
    }

    // 出队操作
    void pop() {
    
    
        data.pop_front();
    }

    // 获取队首元素
    T front() {
    
    
        return data.front();
    }

    // 判断队列是否为空
    bool empty() {
    
    
        return data.empty();
    }

    // 获取队列的大小
    int size() {
    
    
        return data.size();
    }
};

在上面的代码中,我们定义了一个适配器类MyQueue,将list适配为queue。MyQueue类中包含了push、pop、front、empty、size等操作,这些操作实际上都是通过调用list类的相应方法来实现的。在main函数中,我们创建了一个MyQueue对象,并进行了一些入队、出队、获取队首元素等操作,这些操作都是通过MyQueue类来实现的。

猜你喜欢

转载自blog.csdn.net/kevvviinn/article/details/129748576