具有父类和虚函数的堆栈和队列

时间:2018-04-06 04:36:24

标签: c++

我的一项家庭作业是创建Stack和Queue的层次结构。我需要一个超类DataStructure,它有成员函数push和pop。 pop应该只在DataStructure内声明一次,而push需要是一个虚函数。这就是我到目前为止所做的:

#include <iostream>
#include <vector>

using namespace std;

class DataStructure {
protected:
    vector<int> data;
public:
    void push(int element) { }

    int pop() {
        if (data.size() == 0)
            return -1;

        int elem = data.back();
        data.pop_back();
        return elem;
    }
};


class Stack: public DataStructure {

};


class Queue: public DataStructure {

};

我被困住了。我不知道如何实现虚函数。

2 个答案:

答案 0 :(得分:2)

你非常接近。主要是,您在virtual前面缺少void push()关键字。

明确地,

void push(int element) { }

变为:

virtual void push(int element) { }

或者,对于a pure virtual function

virtual void push(int element) = 0;

此外,您现在可以向堆栈和队列添加push()

<强>堆栈

class Stack: public DataStructure {
public:
    void push(int element) {  
        std::cout << "inside Stack.push()";
    }
}; // Stack

<强>队列

class Queue: public DataStructure {
public:
    void push(int element) { 
        std::cout << "inside Queue.push()";
    }
}; // Stack


以下是您的代码的修订版。保持良好的工作!

#include <iostream>
#include <vector>

using namespace std;

class DataStructure {
protected:
    vector<int> data;
public:
    virtual void push(int element) = 0;

    int pop() {
        if (data.size() == 0)
            return -1;

        int elem = data.back();
        data.pop_back();
        return elem;
    } // pop()
}; // DataStructure


class Stack: public DataStructure {
public:
    void push(int element) {  
        std::cout << "inside Stack.push()" << std::endl;
    }
}; // Stack


class Queue: public DataStructure {
public:
    void push(int element) { 
        std::cout << "inside Queue.push()" << std::endl;
    }
}; // Queue

答案 1 :(得分:0)

我将使用deque代替vector,因为deque允许从两端插入和删除。使用vector在这里效率不高,因为您需要在开头使用insert进行插入(对于Queue)。以下是cplusplus的引用:

  

因为矢量使用数组作为其底层存储,所以插入   在矢量端以外的位置的元素导致容器   将所有位置之后的元素重新定位到新的元素   位置。与此相比,这通常是低效的操作   一个由其他类型的序列执行相同的操作   容器

注意 - 请避免使用using namespace std。有关详细信息,请参阅 -

以下是完整代码:

#include <iostream>
#include <deque>

class DataStructure {
protected:
    std::deque<int> data;
public:
    virtual void push(int element) { }

    int pop() {
        if (data.size() == 0)
            return -1;

        int elem = data.back();
        data.pop_back();
        return elem;
    }

    void print() {
        for(std::deque<int>::iterator i=data.begin();i<data.end();i++)
            std::cout << *i;
            std::cout << "\n";
    }
};


class Stack: public DataStructure {
public:
    void push(int element) {  
        data.push_back(element);
    }
}; // Stack


class Queue: public DataStructure {
public:
    void push(int element) { 
        data.push_front(element);
    }
}; // Queue

int main()
{
    Stack s;
    Queue q;
    s.push(1);
    s.print();
    s.push(2);
    s.print();
    s.push(3);
    s.push(4);
    s.print();
    s.push(5);
    s.print();
    s.pop();
    s.print();
    s.pop();
    s.print();
    s.pop();
    s.print();
    s.pop();
    s.print();
    s.pop();
    s.print();

    q.push(1);
    q.print();
    q.push(2);
    q.print();
    q.push(3);
    q.push(4);
    q.print();
    q.push(5);
    q.print();
    q.pop();
    q.print();
    q.pop();
    q.print();
    q.pop();
    q.print();
    q.pop();
    q.print();
    q.pop();
    q.print();

}