You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

栈与队列继承层次作业求助:DataStructure类虚函数push与统一pop实现

栈与队列继承层次结构的完整实现方案

嘿,我来帮你搞定这个C++作业!先明确你的核心需求,再基于你给出的代码片段补全优化,确保完全符合作业要求:

作业核心要求回顾

  • 创建父类 DataStructure,包含 push 和 pop 成员函数
  • push 必须设为虚函数,允许子类(栈、队列)重写实现各自的入栈/入队逻辑
  • pop 仅在父类中声明一次(这里指统一接口声明,子类根据自身特性实现具体弹出逻辑)

你提供的现有代码片段

#include <iostream>
#include <vector>
using namespace std;

class DataStructure {
protected:
    vector<int> data;
public:
    void push(int element) { }
    int pop() {
        if (data.size() == 0...
    }
};

完善后的完整代码实现

下面是满足要求的完整代码,包含子类实现、异常处理和测试逻辑:

#include <iostream>
#include <vector>
#include <stdexcept>
using namespace std;

// 抽象父类:数据结构基类
class DataStructure {
protected:
    vector<int> data; // 子类可直接访问的存储容器
public:
    // 将push声明为纯虚函数,强制子类实现(也可设为普通虚函数提供默认实现)
    virtual void push(int element) = 0;
    
    // pop接口在父类声明,子类重写实现具体逻辑
    virtual int pop() = 0;

    // 通用判空函数,子类可直接使用
    bool isEmpty() const {
        return data.empty();
    }

    // 虚析构函数:确保删除子类对象时正确调用析构链,避免内存泄漏
    virtual ~DataStructure() = default;
};

// 栈子类:遵循后进先出(LIFO)规则
class Stack : public DataStructure {
public:
    void push(int element) override {
        data.push_back(element); // 栈的入栈:尾插元素
    }

    int pop() override {
        if (data.empty()) {
            throw runtime_error("Stack underflow! 栈为空无法弹出");
        }
        int top_val = data.back();
        data.pop_back(); // 栈的出栈:删除最后一个元素
        return top_val;
    }
};

// 队列子类:遵循先进先出(FIFO)规则
class Queue : public DataStructure {
public:
    void push(int element) override {
        data.push_back(element); // 队列的入队:尾插元素
    }

    int pop() override {
        if (data.empty()) {
            throw runtime_error("Queue underflow! 队列为空无法弹出");
        }
        int front_val = data.front();
        data.erase(data.begin()); // 队列的出队:删除第一个元素
        return front_val;
    }
};

// 测试代码
int main() {
    try {
        // 测试栈
        Stack my_stack;
        my_stack.push(10);
        my_stack.push(20);
        my_stack.push(30);
        cout << "栈弹出元素:" << my_stack.pop() << endl; // 输出30
        cout << "栈弹出元素:" << my_stack.pop() << endl; // 输出20

        // 测试队列
        Queue my_queue;
        my_queue.push(100);
        my_queue.push(200);
        my_queue.push(300);
        cout << "队列弹出元素:" << my_queue.pop() << endl; // 输出100
        cout << "队列弹出元素:" << my_queue.pop() << endl; // 输出200

        // 测试空结构弹出(取消注释会触发异常)
        // my_stack.pop();
    } catch (const exception& e) {
        cerr << "错误信息:" << e.what() << endl;
    }
    return 0;
}

关键细节解释

  1. 纯虚函数的使用:把 push 和 pop 设为纯虚函数,让 DataStructure 成为抽象类,不能直接实例化,既符合“父类仅定义接口”的设计思路,又强制子类必须实现这两个核心方法。
  2. 子类特性实现:栈的 pop 操作删除容器最后一个元素,队列的 pop 删除第一个元素,完美贴合各自的规则;两者的 push 都是尾插,虽然逻辑一致,但因父类要求 push 是虚函数,所以子类仍需显式重写(也可以在父类提供默认实现,子类按需修改)。
  3. 异常处理:在 pop 时检查容器是否为空,抛出明确的异常信息,避免程序因非法访问崩溃,增强代码健壮性。
  4. 虚析构函数:父类添加虚析构函数是C++继承体系中的最佳实践,确保当你用父类指针指向子类对象并删除时,能正确调用子类的析构函数,避免内存泄漏。

内容的提问来源于stack exchange,提问作者user9603529

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:18:49