C++线性技巧,STL
发布人:shili8
发布时间:2025-02-15 22:46
阅读次数:0
**C++线性技巧与STL**
在编程领域,线性技巧(Linear Techniques)是指使用线性的算法来解决问题的方法。这些技巧包括了各种数据结构和算法,如链表、栈、队列、树等。在C++中,我们可以使用标准模板库(STL)提供的容器类来实现这些线性技巧。
**1. 链表**
链表是一种常见的线性数据结构,它由一系列的结点组成,每个结点包含一个值和一个指向下一个结点的指针。链表可以用于实现栈、队列等数据结构。
cpp// 定义一个结点类struct Node { int data; Node* next; }; // 链表类class LinkedList { public: Node* head; // 构造函数 LinkedList() : head(nullptr) {} // 添加元素到链表尾部 void push_back(int value) { Node* newNode = new Node(); newNode->data = value; newNode->next = nullptr; if (head == nullptr) { head = newNode; } else { Node* current = head; while (current->next != nullptr) { current = current->next; } current->next = newNode; } } // 删除链表中的元素 void remove(int value) { if (head == nullptr) return; if (head->data == value) { Node* temp = head; head = head->next; delete temp; return; } Node* current = head; while (current->next != nullptr) { if (current->next->data == value) { Node* temp = current->next; current->next = current->next->next; delete temp; return; } current = current->next; } } // 打印链表中的元素 void print() { Node* current = head; while (current != nullptr) { std::cout << current->data << " "; current = current->next; } std::cout << std::endl; } };
**2. 栈**
栈是一种线性数据结构,它遵循后进先出的原则。栈可以用于实现递归算法、括号匹配等问题。
cpp// 定义一个栈类class Stack { private: int* elements; int top; int capacity; public: // 构造函数 Stack(int size) : capacity(size), top(-1) { elements = new int[capacity]; } // 添加元素到栈顶 void push(int value) { if (top == capacity -1) { std::cerr << "Stack is full!" << std::endl; return; } elements[++top] = value; } // 删除栈顶元素 int pop() { if (top == -1) { std::cerr << "Stack is empty!" << std::endl; return -1; // or throw an exception } return elements[top--]; } // 查看栈顶元素 int peek() { if (top == -1) { std::cerr << "Stack is empty!" << std::endl; return -1; // or throw an exception } return elements[top]; } // 判断栈是否为空 bool isEmpty() { return top == -1; } // 销毁栈 ~Stack() { delete[] elements; } };
**3. 队列**
队列是一种线性数据结构,它遵循先进先出的原则。队列可以用于实现生产者-消费者问题等问题。
cpp// 定义一个队列类class Queue { private: int* elements; int front; int rear; int capacity; public: // 构造函数 Queue(int size) : capacity(size), front(0), rear(-1) { elements = new int[capacity]; } // 添加元素到队列尾部 void enqueue(int value) { if (rear == capacity -1) { std::cerr << "Queue is full!" << std::endl; return; } elements[++rear] = value; } // 删除队列头部元素 int dequeue() { if (front > rear) { std::cerr << "Queue is empty!" << std::endl; return -1; // or throw an exception } return elements[front++]; } // 查看队列头部元素 int peek() { if (front > rear) { std::cerr << "Queue is empty!" << std::endl; return -1; // or throw an exception } return elements[front]; } // 判断队列是否为空 bool isEmpty() { return front > rear; } // 销毁队列 ~Queue() { delete[] elements; } };
**4. STL容器类**
STL提供了各种容器类,如vector、list、stack、queue等。这些容器类可以用于实现线性技巧。
cpp// 使用vector实现链表#include <vector> class LinkedList { public: std::vector<int> elements; // 添加元素到链表尾部 void push_back(int value) { elements.push_back(value); } // 删除链表中的元素 void remove(int value) { elements.erase(std::remove(elements.begin(), elements.end(), value), elements.end()); } // 打印链表中的元素 void print() { for (int element : elements) { std::cout << element << " "; } std::cout << std::endl; } };
cpp// 使用stack实现栈#include <stack> class Stack { public: std::stack<int> stack; // 添加元素到栈顶 void push(int value) { stack.push(value); } // 删除栈顶元素 int pop() { return stack.top(); } // 查看栈顶元素 int peek() { return stack.top(); } };
cpp// 使用queue实现队列#include <queue> class Queue { public: std::queue<int> queue; // 添加元素到队列尾部 void enqueue(int value) { queue.push(value); } // 删除队列头部元素 int dequeue() { return queue.front(); } // 查看队列头部元素 int peek() { return queue.front(); } };
以上是C++线性技巧与STL的相关内容。这些技巧和容器类可以用于实现各种数据结构和算法,提高编程效率和代码质量。