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

Stack and Queue with parent class and virtual function

本文关键字:堆栈 队列 函数 虚拟 父类      更新时间:2023-10-16

我的家庭作业之一是创建堆栈和队列的层次结构。我需要有一个具有成员函数 push 和 pop 的超类DataStructurepop 应该只在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();
}