具有父类和虚拟函数的堆栈和队列
Stack and Queue with parent class and virtual function
我的家庭作业之一是创建堆栈和队列的层次结构。我需要有一个具有成员函数 push 和 pop 的超类DataStructure
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 {
};
我被困住了。我不知道如何实现虚拟功能。
你离得很近。主要是,您在void push()
前面缺少virtual
关键字。
明确地
void push(int element) { }
成为:
virtual void push(int element) { }
或者,对于纯虚函数:
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
我将使用deque
而不是vector
,因为deque
允许从两端插入和删除。在这里使用vector
效率低下,因为您需要在开头使用insert
插入(对于队列)。以下是cplusplus的引述:
由于向量使用数组作为其基础存储,因此插入 位于矢量端以外位置的元素导致容器 将定位后的所有元素重新定位到新的 位置。与 通过其他类型的序列为同一操作执行一个 器皿
注意- 请避免使用using namespace std
。有关详细信息,请参阅 -
- 为什么"使用命名空间 std"被认为是不好的做法?
- 它产生的问题的活生生的例子: 如何使用迭代器?
- 再比如—— C++中指针和引用的混淆
以下是完整的代码:
#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();
}
相关文章:
- 堆栈和队列是否像C++中的数组一样传递?
- 了解使用堆栈实现队列的递归调用机制
- 为什么某些 STL 容器(堆栈、队列、优先级队列)不支持迭代器?
- 嵌套容器:为什么我无法访问堆栈队列顶部的堆栈?C++
- 堆栈和队列的C++默认实现
- 前缀表示法 C++,分段错误(堆栈和队列)
- 将元素从队列复制到堆栈
- 具有父类和虚拟函数的堆栈和队列
- 在C++中使用队列和堆栈对 2 个向量进行加减
- 在堆或堆栈上分配的 std::队列的内存
- 使用提升库在队列和堆栈数据结构上保存和加载数据时出错
- 尝试使用堆栈创建队列.为什么我会遇到int转换错误的空白
- 堆栈,队列延迟
- 将双重链接列表与C 中的堆栈和队列类链接
- 堆栈和队列在 Dev-C++ 中给出错误
- 根据堆栈类实现队列类的复制构造函数
- 过度填充堆栈和队列容量(C )
- 堆栈/队列 C++ 中的内存泄漏
- 使用C++堆栈/队列分析XML文件
- 什么是堆栈?arrayStack ?arrayQueue ?堆栈队列 ?它们在C++上有何不同