我的一项家庭作业是创建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 {
};
我被困住了。我不知道如何实现虚函数。
答案 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();
}