From d305d58e50550388bcfba075a000714d0f4555b5 Mon Sep 17 00:00:00 2001 From: clzhao98 Date: Sun, 28 Jul 2024 14:53:08 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20=E6=B7=BB=E5=8A=A0=20list?= =?UTF-8?q?=20=E5=AE=9E=E7=8E=B0=E4=B8=8E=E6=B5=8B=E8=AF=95=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20stack=20=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 ++ CMakeLists.txt | 1 + include/list.h | 49 ++++++++++++++++------------ include/stack.h | 35 ++++++++++++++++++++ src/CMakeLists.txt | 6 ++-- src/list.cpp | 77 +++++++++++++++++++++++++++++++++----------- tests/CMakeLists.txt | 11 +++++++ tests/test-list.cpp | 26 +++++++++++++++ tests/test-stack.cpp | 21 ++++++++++++ 9 files changed, 186 insertions(+), 43 deletions(-) create mode 100644 include/stack.h create mode 100644 tests/CMakeLists.txt create mode 100644 tests/test-list.cpp create mode 100644 tests/test-stack.cpp diff --git a/.gitignore b/.gitignore index a0aa113..af2217f 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,6 @@ dist/ *.exe *.out *.app + +build/ +.cache \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 7a4e53d..71436da 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,3 +15,4 @@ include_directories( add_subdirectory(src) add_subdirectory(include) +add_subdirectory(tests) \ No newline at end of file diff --git a/include/list.h b/include/list.h index 98f2c95..06365ed 100644 --- a/include/list.h +++ b/include/list.h @@ -1,35 +1,42 @@ +/** + * @file list.h + * @author clzhao98 + * @brief + * @version 0.1 + * @date 2024-07-28 + * + * @copyright Copyright (c) 2024 + * + */ #ifndef __LIST__H__ #define __LIST__H__ + + #include -struct Node { - size_t data_p; - Node *next; + +struct ListNode { + size_t val_; + ListNode *next; + ListNode(size_t val): val_(val), next(nullptr){} // 构造函数 }; + class List { +public: List(); ~List(); - void push_back(int data); - void push_front(int data); - void insert(int data, int index); + size_t front() const; + size_t back() const; + void push_back(size_t val); void pop_back(); - void pop_front(); - void remove(int index); - void print(); - int size(); - bool empty(); - void clear(); - int front(); - int back(); - - + size_t size() const; + void dump() const; private: - Node *head_; - Node *tail_; - int count_; - - + ListNode *head_; + ListNode *tail_; + size_t size_; }; + #endif //!__LIST__H__ \ No newline at end of file diff --git a/include/stack.h b/include/stack.h new file mode 100644 index 0000000..4607c88 --- /dev/null +++ b/include/stack.h @@ -0,0 +1,35 @@ +/** + * @file stack.h + * @author clzhao98 + * @brief + * @version 0.1 + * @date 2024-07-28 + * + * @copyright Copyright (c) 2024 + * + */ +#ifndef __STACK__H__ +#define __STACK__H__ +/** + * @brief 先入先出 + * + */ + +#include +class Stack +{ +private: + size_t capacity_; + +public: + Stack(); + ~Stack(); + void push(size_t val); + void pop(); + size_t top(); + bool empty(); + size_t size(); +}; + + +#endif //!__STACK__H__ \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2efb8b9..0b7448e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,6 +1,6 @@ -## 添加list library -## 设置include +## 添加 list library +## 设置 include add_library(list STATIC) target_sources(list PRIVATE list.cpp) -target_include_directories(list PUBLIC ${INCLUDE_DIR}) +target_include_directories(list PUBLIC ${INCLUDE_DIR}/include) diff --git a/src/list.cpp b/src/list.cpp index 4423c4a..800d9b5 100644 --- a/src/list.cpp +++ b/src/list.cpp @@ -1,32 +1,71 @@ #include "list.h" +#include +#include -List::List(): head_(nullptr), tail_(nullptr), count_(0) {} +List::List(): head_(nullptr), tail_(nullptr), size_(0) {} List::~List() { - clear(); + while (head_ != nullptr) { + ListNode *tmp = head_; + head_ = head_->next; + delete tmp; + } } -void List::push_back(int data) { - Node *new_node = new Node; - new_node->data_p = data; - new_node->next = nullptr; +size_t List::front() const { + return head_->val_; +} + +size_t List::back() const { + return tail_->val_; +} + +size_t List::size() const{ + return size_; +} + +void List::dump() const { + ListNode *tmp = head_; + for (int i = 0; i < size_; i++) + { + std::cout <val_ << " "; + tmp = tmp->next; + if(tmp == nullptr){ + break; + } + } + std::cout << std::endl; + +} + +void List::push_back(size_t val) { + ListNode *node = new ListNode(val); if (head_ == nullptr) { - head_ = new_node; - tail_ = new_node; + head_ = node; + tail_ = node; } else { - tail_->next = new_node; - tail_ = new_node; + tail_->next = node; + tail_ = node; } - count_++; + size_++; } -void List::push_front(int data) { - Node *new_node = new Node; - new_node->data_p = data; - new_node->next = head_; - head_ = new_node; - if (tail_ == nullptr) { - tail_ = new_node; +void List::pop_back() { + if (head_ == nullptr) { + return; } - count_++; + if (head_ == tail_) { + delete head_; + head_ = nullptr; + tail_ = nullptr; + } else { + ListNode *tmp = head_; + while (tmp->next != tail_) { + tmp = tmp->next; + } + delete tail_; + tail_ = tmp; + tail_->next = nullptr; + } + size_--; } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..df2cec3 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,11 @@ +## 添加 list library +## 设置 include + + +add_executable(test-list test-list.cpp) +target_link_libraries(test-list list) +target_include_directories(test-list PRIVATE ${INCLUDE_DIR}) + + +add_executable(test-stack test-stack.cpp) + diff --git a/tests/test-list.cpp b/tests/test-list.cpp new file mode 100644 index 0000000..efc8229 --- /dev/null +++ b/tests/test-list.cpp @@ -0,0 +1,26 @@ +#include "list.h" +#include + + +void test(){ + List list; + list.push_back(1); + list.push_back(2); + list.push_back(3); + + std::cout << "First elecment:" << list.front() << std::endl; + std::cout << "Last elecment:" << list.back() << std::endl; + std::cout << "Size:" << list.size() << std::endl; + std::cout << "List elements:" << std::endl; + list.dump(); + list.pop_back(); + std::cout << "After pop_back:" << std::endl; + list.dump(); + +} + +int main(int argc, char **argv) +{ + test(); + return 0; +} diff --git a/tests/test-stack.cpp b/tests/test-stack.cpp new file mode 100644 index 0000000..102b76e --- /dev/null +++ b/tests/test-stack.cpp @@ -0,0 +1,21 @@ +#include +#include + +int main(int argc, char **argv) +{ + std::stack stack; + stack.push(1); + stack.push(2); + stack.push(3); + std::cout << "Current stack size: "<< stack.size() << std::endl; + std::cout << "Stack is empty? "<< stack.empty() << std::endl; + while (!stack.empty()) + { + std::cout << stack.top() << " "; + stack.pop(); + } + std::cout << std::endl; + + // system("pause"); + return 0; +}