Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commitb65a2ae726a67f498a934d0c0124297a23e42461 (patch)
Author
 Syndamia <kamen@syndamia.com>
2022-10-17 19:09:31 +0300
Committer
 Syndamia <kamen@syndamia.com>
2022-10-17 19:09:31 +0300
Filesc54a57f45d94b8c41d1d5eb7fa6d834d17d01fb3
uni-projects-b65a2ae726a67f498a934d0c0124297a23e42461.tar
uni-projects-b65a2ae726a67f498a934d0c0124297a23e42461.tar.gz
uni-projects-b65a2ae726a67f498a934d0c0124297a23e42461.zip
Parent1ee27f4f99bab9879917168b000e00ce3f7a15ff (diff)
[SDP/P02] Solved exercises from second practicum
1 files changed, 141 insertions, 0 deletions
-rw-r--r--Year 2/Structures and data algorithms/02-Practicum-12.10.2022.cpp141
diff --git a/Year 2/Structures and data algorithms/02-Practicum-12.10.2022.cpp b/Year 2/Structures and data algorithms/02-Practicum-12.10.2022.cpp
new file mode 100644
index 0000000..5962c93
--- /dev/null
+++ b/Year 2/Structures and data algorithms/02-Practicum-12.10.2022.cpp
@@ -0,0 +1,141 @@
+#include <iostream>
+#include <cstring>
+
+template <class T>
+class StackElem {
+ T data;
+ StackElem* next;
+
+public:
+ StackElem(T data) : StackElem(data, nullptr) {}
+ StackElem(T data, StackElem* se) : data(data), next(se) {}
+ ~StackElem() = default;
+ StackElem(StackElem& other) = delete;
+ StackElem& operator=(StackElem& other) = delete;
+
+ const T& get_data() { return this->data; }
+ StackElem* get_next() { return this->next; }
+ void set_next(StackElem* next) { this->next = next; }
+};
+
+template <class T>
+class Stack {
+ StackElem<T>* topPtr;
+ StackElem<T>* startPtr;
+
+public:
+ Stack() : topPtr(), startPtr() {}
+ Stack(Stack& other) = delete;
+ ~Stack() {
+ StackElem<T>* temp;
+ while (startPtr != nullptr) {
+ temp = startPtr->get_next();
+ delete startPtr;
+ startPtr = temp;
+ }
+ }
+ Stack& operator=(Stack& other) = delete;
+
+ void push(T value) {
+ if (topPtr == nullptr)
+ startPtr = topPtr = new StackElem<T>(value);
+ else {
+ topPtr->set_next(new StackElem<T>(value));
+ topPtr = topPtr->get_next();
+ }
+ }
+
+ T pop() {
+ if (topPtr == nullptr) return T();
+
+ T temp = topPtr->get_data();
+ if (startPtr == topPtr) {
+ delete topPtr;
+ startPtr = topPtr = nullptr;
+ return temp;
+ }
+
+ StackElem<T>* prevDel = startPtr;
+ while (prevDel->get_next() != topPtr)
+ prevDel = prevDel->get_next();
+
+ delete topPtr;
+ topPtr = prevDel;
+ prevDel->set_next(nullptr);
+ return temp;
+ }
+
+ T top() {
+ if (topPtr == nullptr) return T();
+
+ return topPtr->get_data();
+ }
+};
+
+// Exercise 1
+
+void ex1() {
+ const char* str = "thi*s i*s exampl*e";
+ unsigned strLen = strlen(str);
+
+ Stack<char> parsedStr;
+ for (unsigned i = 0; i < strLen; i++) {
+ if (str[i] == '*') parsedStr.pop();
+ else parsedStr.push(str[i]);
+ }
+
+ while (parsedStr.top() != char())
+ std::cout << parsedStr.pop();
+ std::cout << std::endl;
+}
+
+// Exercise 2
+
+void ex2() {
+ const char* str = "()()(())";
+ unsigned strLen = strlen(str);
+
+ Stack<char> brackets;
+ for (unsigned i = 0; i < strLen; i++) {
+ if (str[i] == '(') brackets.push('(');
+ else if (str[i] == ')') brackets.pop();
+ }
+
+ if (brackets.top() != '(')
+ std::cout << "Balanced" << std::endl;
+ else
+ std::cout << "Unbalanced" << std::endl;
+}
+
+// Exercise 3
+
+void ex3() {
+ const char* str = "1 2 - 3 + 10 *";
+
+ Stack<int> calc;
+ while (*str != '\0') {
+ if (*str >= '0' && *str <= '9') {
+ calc.push(atoi(str));
+ while (*str >= '0' && *str <= '9')
+ str++;
+ }
+ else if (*str == '+')
+ calc.push(calc.pop() + calc.pop());
+ else if (*str == '-')
+ calc.push(calc.pop() - calc.pop());
+ else if (*str == '*')
+ calc.push(calc.pop() * calc.pop());
+ else if (*str == '/')
+ calc.push(calc.pop() / calc.pop());
+ else if (*str == '%')
+ calc.push(calc.pop() % calc.pop());
+
+ str++;
+ }
+
+ std::cout << calc.top() << std::endl;
+}
+
+int main() {
+ ex3();
+}