C++:采用模板封装顺序表,栈,队列

news/2024/12/22 16:24:31/

1.顺序表:

list.hpp

#ifndef LIST_HPP
#define LIST_HPP
#include <iostream>using namespace std;template <class L>class Seqlist
{
private:L *ptr;L size;L len=0;public:void init(L n){//堆区申请空间(大小为n)this->ptr=new L[n];//bzero(this->ptr,sizeof(L)*n);this->len=0;this->size=n;//}bool empty(){return this->len==0;}bool full(){return this->len==this->size;}void push_back(L e)//尾插{if(this->full()){return ;}this->ptr[len++]=e;}//插入void insert(L index,L num){if(full()){return;}for(L i=len-1;i>=index-1;i--){ptr[i+1]=ptr[i];}ptr[index-1]=num;len++;}//任意位置删除void erase(L index){if(empty()){return;}for(L i=index;i<len;i++){ptr[i-1]=ptr[i];ptr[i]=NULL;}len--;}//尾删void pop_back(){if(empty()){return;}ptr[len-1]=NULL;len--;}void show(){//判空if(len==0){return;}cout<<"顺序表"<<endl;for(int i=0;i<len;i++){cout<<ptr[i]<<ends;}cout<<endl;}//当前长度L cur_size(){if(empty()){return 0;}else{return len;}}L at(L index){L num;num=ptr[index-1];return num;}void sort(bool flag){if(flag){for(int i=1;i<len;i++){for(int j=0;j<len-i;j++){if(ptr[j]>ptr[j+1]){L temp;temp=ptr[j];ptr[j]=ptr[j+1];ptr[j+1]=temp;}}}}else{for(int i=1;i<len;i++){for(int j=0;j<len-i;j++){if(ptr[j]<ptr[j+1]){L temp;temp=ptr[j];ptr[j]=ptr[j+1];ptr[j+1]=temp;}}}}}};
#endif // LIST_HPP

2.栈:

strack.hpp

#ifndef STACK_HPP
#define STACK_HPP#include <iostream>
#include <exception>
using namespace std;template <class T>
class StackNode
{
public:T data;//存储数据StackNode *next;//指向下一个节点//构造函数StackNode(T d):data(d),next(nullptr){}};
template <class T>
class Stack
{
private:StackNode<T> *top;//指向栈顶int len;//栈中元素数量public:Stack():top(nullptr),len(0){}//析构函数~Stack(){while(!empty()){pop();}}bool empty() //判断栈是否为空{return top==nullptr;}int size()//获取栈的大小{return len;}//压栈操作void push(T element){StackNode<T>  *newnode=new StackNode<T>(element);//申请空间并初始化newnode->next=top;top=newnode;len++;}//出栈操作T pop(){if(empty()){throw out_of_range("空栈");}StackNode<T>  *temp=top;T value=top->data;top=top->next;delete temp;len--;return value;}//查看栈顶元素T look_top(){if(empty()){throw out_of_range("空栈");}return top->data;}//清空栈void clear(){while (!empty()){pop();}}Stack& operator=(const Stack& other){if (this != &other){clear(); // 清空当前栈// 复制元素StackNode<T>  *current = other.top;while (current != nullptr){push(current->data);current = current->next;}}return *this;}void swap(Stack& other){StackNode<T> * tempTop = top;top = other.top;other.top = tempTop;T templen = len;len = other.len;other.len = templen;}
};#endif // STACK_HPP

3.队列:

queue.hpp

#ifndef QUEUE_H
#define QUEUE_H#include <iostream>
#include <exception>
using namespace std;template <class T>
class QueueNode
{
public:T data;QueueNode *next;//有参构造QueueNode(T d):data(d),next(nullptr){}
};
template <class T>
class Queue
{
private:QueueNode<T>* front; // 指向队列头部的指针QueueNode<T>* rear;  // 指向队列尾部的指针int count;        // 队列中元素的数量public:// 构造函数Queue() : front(nullptr), rear(nullptr), count(0){}~Queue(){clear();}void clear(){while (front != nullptr){QueueNode<T>* temp = front;front = front->next;delete temp;}rear = nullptr;count = 0;}// 查看队列前端元素T frontElement(){if (empty()){throw std::out_of_range("空队列");}return front->data;}// 查看队列尾部元素T backElement(){if (empty()){throw std::out_of_range("空队列");}return rear->data;}//判断队列是否为空bool empty(){return front == nullptr;}// 获取队列的大小int size(){return count;}// 入队操作void push(T element){QueueNode<T>* newNode = new QueueNode<T>(element);if (rear == nullptr)  // 队列为空{front = rear = newNode;} else{rear->next = newNode;rear = newNode;}count++;}// 出队操作T pop(){if (empty()) {throw std::out_of_range("空队列");}QueueNode<T>* temp = front;T dequeuedValue = front->data;front = front->next;if (front == nullptr) {rear = nullptr;}delete temp;count--;return dequeuedValue;}void swap(Queue& other) {using std::swap;swap(front, other.front);swap(rear, other.rear);swap(count, other.count);}Queue& operator=(const Queue& other){if (this != &other){Queue temp(other); // 临时对象,用于深拷贝swap(temp); // 与临时对象交换内容}return *this;}};
#endif // QUEUE_H


http://www.ppmy.cn/news/1534333.html

相关文章

浅谈stm32的GPIO引脚配置模式

STM32的GPIO&#xff08;通用输入输出&#xff09;引脚可以被配置为多种模式&#xff0c;以适应不同的应用场景。下面介绍一些一些常见的STM32 GPIO引脚模式&#xff1a; 模拟输入模式&#xff08;Analog Input Mode&#xff09;&#xff1a;在这种模式下&#xff0c;GPIO引脚被…

2、Spring Boot 3.x 集成 Feign

一、前言 本篇主要是围绕着两个点&#xff0c;1、集成 Feign&#xff0c;2、分离feign接口层&#xff0c;独立服务&#xff1b; 还有一点就是上篇文章的服务 iot-channel、system-server 服务名称调整成为了 chain-iot-channel、chain-system二、搭建 chain-common 服务 pom.…

C# (.net6)实现Redis发布和订阅简单案例

概念&#xff1a; 在 .NET 6 中使用 Redis 的/订发布阅模式。发布/订阅&#xff08;Pub/Sub&#xff09;是 Redis 支持的一种消息传递模式&#xff0c;其中一个或多个发布者向一个或多个订阅者发送消息,Redis 客户端可以订阅任意数量的频道。 多个客户端可以订阅一个相同的频道…

MongoDB伪分布式部署(mac M2)

1. 序言 本博客是上一博客的进阶版&#xff1a;mac M2安装单机版 MongoDB 7.x&#xff0c;上一博客可以看做是单机、单节点部署MongoDB本博客将介绍单机、多服务部署MongoDB&#xff0c;实际就是伪分布式部署 2. 副本集(Replica Set)方式部署 2.1 什么是副本集&#xff1f; …

Netgear-WN604 downloadFile.php 信息泄露复现(CVE-2024-6646)

0x01 产品描述&#xff1a; NETGEAR WN604是一款功能强大的双频AC1200无线路由器,非常适合中大型家庭和企业使用。它支持最新的802.11ac无线标准,能提供高达1200Mbps的无线传输速度。路由器具备千兆有线网口和3个100Mbps有线网口,可满足有线和无线设备的接入需求。此外,它还内置…

element-ui 通过按钮式触发日期选择器

element ui 写在前面1. 自定义的日期时间组件CustomDatePicker.vue2. 页面效果总结写在最后 写在前面 需求&#xff1a;elementui中日期时间选择器&#xff0c;目前只能通过点击input输入框触发日期选择器&#xff0c;我希望能通过其他方式触发日期选择器同时把input输入框去掉…

git如何将多个提交合并为一个提交

目录 第一种&#xff1a;使用git rebase命令 第二种&#xff1a;使用git reset命令 重新提交 第一种&#xff1a;使用git rebase命令 使用以下命令的其中一种启动交互式 rebase git rebase -i 你想要合并提交的父提交的哈希值git rebase -i <commit-hash>^ &#…

实战4、爬取淘宝商品数据-selenium模拟

1、登录 在页面中找到登录按键&#xff0c;使用selenium模拟点击 button_login wd.find_element(By.XPATH,"//li[idJ_SiteNavMytaobao]/div[classsite-nav-menu-hd]/a[target_top]")button_login.click()找到用户名密码所在位置模拟输入 # 模拟输入账密button_us…