Skip to content

Commit fc5ca10

Browse files
authored
Update stack.cpp
Here is the updated code for stack.py in c++ implementation. I have checked the array.py and array.cpp and then imported the required modules/ libraries.
1 parent ed88315 commit fc5ca10

File tree

1 file changed

+127
-28
lines changed
  • pydatastructs/miscellaneous_data_structures/_backend/cpp/stack

1 file changed

+127
-28
lines changed
Lines changed: 127 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,147 @@
11
#include <Python.h>
2-
#include "ArrayStack.hpp"
2+
#include <vector>
3+
#include <stdexcept>
4+
#include "SinglyLinkedList.hpp"
5+
#include "DynamicOneDimensionalArray.hpp"
36

4-
static struct PyModuleDef stack_struct = {
7+
// Forward declarations for types in the module
8+
extern PyTypeObject ArrayStackType;
9+
extern PyTypeObject LinkedListStackType;
10+
11+
static struct PyModuleDef stackmodule = {
512
PyModuleDef_HEAD_INIT,
613
"_stack",
7-
0,
14+
"Stack Data Structure Module",
815
-1,
9-
NULL,
16+
NULL
1017
};
1118

12-
PyMODINIT_FUNC PyInit__stack(void) {
13-
Py_Initialize();
14-
PyObject *stack = PyModule_Create(&stack_struct);
19+
// Stack base class (Abstract class)
20+
class Stack {
21+
public:
22+
virtual void push(PyObject* x) = 0;
23+
virtual PyObject* pop() = 0;
24+
virtual bool is_empty() = 0;
25+
virtual PyObject* peek() = 0;
26+
virtual Py_ssize_t __len__() = 0;
27+
virtual const char* __str__() = 0;
28+
};
1529

16-
if (PyType_Ready(&ArrayStackType) < 0) {
17-
return NULL;
30+
// ArrayStack Implementation (Derived class)
31+
class ArrayStack : public Stack {
32+
public:
33+
std::vector<PyObject*> items; // Dynamic array to store items
34+
35+
ArrayStack() {}
36+
37+
ArrayStack(std::vector<PyObject*> initial_items) {
38+
items = initial_items;
1839
}
19-
Py_INCREF(&ArrayStackType);
20-
PyModule_AddObject(stack, "ArrayStack", reinterpret_cast<PyObject*>(&ArrayStackType));
2140

22-
if (PyType_Ready(&ArrayType) < 0) {
23-
return NULL;
41+
void push(PyObject* x) override {
42+
items.push_back(x);
2443
}
25-
Py_INCREF(&ArrayType);
26-
PyModule_AddObject(stack, "Array", reinterpret_cast<PyObject*>(&ArrayType));
2744

28-
if (PyType_Ready(&OneDimensionalArrayType) < 0) {
29-
return NULL;
45+
PyObject* pop() override {
46+
if (is_empty()) {
47+
throw std::out_of_range("Stack is empty");
48+
}
49+
PyObject* top_element = items.back();
50+
items.pop_back();
51+
return top_element;
3052
}
31-
Py_INCREF(&OneDimensionalArrayType);
32-
PyModule_AddObject(stack, "OneDimensionalArray", reinterpret_cast<PyObject*>(&OneDimensionalArrayType));
3353

34-
if (PyType_Ready(&DynamicArrayType) < 0) {
35-
return NULL;
54+
bool is_empty() override {
55+
return items.empty();
3656
}
37-
Py_INCREF(&DynamicArrayType);
38-
PyModule_AddObject(stack, "DynamicArray", reinterpret_cast<PyObject*>(&DynamicArrayType));
3957

40-
if (PyType_Ready(&DynamicOneDimensionalArrayType) < 0) {
41-
return NULL;
58+
PyObject* peek() override {
59+
if (is_empty()) {
60+
throw std::out_of_range("Stack is empty");
61+
}
62+
return items.back();
63+
}
64+
65+
Py_ssize_t __len__() override {
66+
return items.size();
67+
}
68+
69+
const char* __str__() override {
70+
std::string result = "[";
71+
for (size_t i = 0; i < items.size(); ++i) {
72+
result += PyUnicode_AsUTF8(PyObject_Str(items[i]));
73+
if (i != items.size() - 1) {
74+
result += ", ";
75+
}
76+
}
77+
result += "]";
78+
return result.c_str();
79+
}
80+
};
81+
82+
// LinkedListStack Implementation (Derived class)
83+
class LinkedListStack : public Stack {
84+
public:
85+
SinglyLinkedList stack; // Linked list to store the stack elements
86+
87+
LinkedListStack() {}
88+
89+
LinkedListStack(std::vector<PyObject*> initial_items) {
90+
for (auto& item : initial_items) {
91+
push(item);
92+
}
93+
}
94+
95+
void push(PyObject* x) override {
96+
stack.appendleft(x);
97+
}
98+
99+
PyObject* pop() override {
100+
if (is_empty()) {
101+
throw std::out_of_range("Stack is empty");
102+
}
103+
return stack.popleft();
42104
}
43-
Py_INCREF(&DynamicOneDimensionalArrayType);
44-
PyModule_AddObject(stack, "DynamicOneDimensionalArray", reinterpret_cast<PyObject*>(&DynamicOneDimensionalArrayType));
45105

106+
bool is_empty() override {
107+
return stack.size() == 0;
108+
}
109+
110+
PyObject* peek() override {
111+
return stack.head;
112+
}
113+
114+
Py_ssize_t __len__() override {
115+
return stack.size();
116+
}
117+
118+
const char* __str__() override {
119+
std::string result = "[";
120+
auto node = stack.head;
121+
while (node != nullptr) {
122+
result += PyUnicode_AsUTF8(PyObject_Str(node->data));
123+
if (node->next != nullptr) {
124+
result += ", ";
125+
}
126+
node = node->next;
127+
}
128+
result += "]";
129+
return result.c_str();
130+
}
131+
};
132+
133+
// Python Module Initialization
134+
PyMODINIT_FUNC PyInit__stack(void) {
135+
PyObject *stack_module = PyModule_Create(&stackmodule);
136+
if (PyType_Ready(&ArrayStackType) < 0)
137+
return NULL;
138+
Py_INCREF(&ArrayStackType);
139+
PyModule_AddObject(stack_module, "ArrayStack", (PyObject*)&ArrayStackType);
140+
141+
if (PyType_Ready(&LinkedListStackType) < 0)
142+
return NULL;
143+
Py_INCREF(&LinkedListStackType);
144+
PyModule_AddObject(stack_module, "LinkedListStack", (PyObject*)&LinkedListStackType);
46145

47-
return stack;
146+
return stack_module;
48147
}

0 commit comments

Comments
 (0)