首页 > 编程语言 >C++ 手撕--基本数据结构的简单实现

C++ 手撕--基本数据结构的简单实现

时间:2024-10-31 21:43:32浏览次数:1  
标签:capacity -- pop int inputQueue C++ 数据结构 other size

C++面试手撕代码----基本数据结构的简单实现

1. String 数据结构的简单实现

#include <iostream>
#include <cstring> // for strcpy strlen methods

using namespace std;

class String {
private:
	char* data;
	size_t length;
public:
	String() : data(nullptr), length(0){}

	String(const char* str){ // parameter constructor function
        if (str){
            length = strlen(str);
            data = new char[length + 1];
            strcpy(data, str);
        }
        else {
            data = nullptr;
            length = 0;
        }
    }

	String(const String& other){ // copy constructor function
        length = other.length;
        if (length > 0){
            data = new char[length + 1];
            strcpy(data, other);
        }
        else{
            data = nullptr;
        }
    }

	String(String&& other) onexcept : length(other.length), data(other.data) { // move constructor function
        other.length = 0;
        other.data = nullptr;
    }

	~String(){    // release resource by deconstructor function
        delete[] data;
    }

	size_t get_size() const { // outside API for get size of String
        return length;
    }

	void printStr() const { // for print String
        if (data){
            cout << data << endl;
        }
        else {
            cout << "Empty String" << endl;
        }
    }
};

2. Vector数据结构的简单实现

#include <iostream>
#include <stdexcept>

using namespace std;

class Vector {
private:
	size_t size; // current size of vector
	size_t capacity; // max capacity
	int *arr; // dynamic array
	
	void resize(){ // expand capacity if current capacity not enough
		capacity *= 2;
		int* newArr = new int[capacity];
		for (size_t i = 0; i < size; ++i){
			newArr[i] = arr[i];
		}
		arr = newArr;
	}
public:
	Vector() : size(0), capacity(2){
		arr = new int[capacity];
	}
	
	Vector(const Vector& other) : size(other.size), capacity(other.capacity) { // copy constructor function
		arr = new int[capacity];
		for (size_t i = 0; i < size; ++i){
			arr[i] = other.arr[i];
		}
	}
	int& operator[](int index){ // override operator [] for get i-th data;
		if (index < 0 || index >= size){
			throw std::out_of_range("Index out of range");
		}
		return arr[index];
	}
	const int& operator[](int index) const {
		if (index < 0 || index >= size){
			throw std::out_of_range("Index out of range");
		}
		return arr[index];
	}
	Vector& operator=(const Vector& other){ // override operator = to copy vector;
		if (this == &other){
			return *this;
		}
		delete[] arr;
		size = other.size;
		capacity = other.capacity;
		arr = new int[capacity];
		
		for (size_t i = 0; i < size; ++i){
			arr[i] = other.arr[i];
		}
		return *this;
	}
	
	~Vector() {
		delete[] arr;
	}
	
	void push_back(const int value) { // push element to back of vector
		if (size >= capacity){
			resize();
		}
		arr[size++] = value;
	}
	void pop_back(){  // pop back element of vector;
		if (size == 0){
			throw std::out_of_range("Vector is empty");
		}
		--size;
	}
	
	size_t size() const {
		return size;
	}
	
	size_t capacity() const {
		return capacity;
	}
};

3. 基于Stack实现Queue数据结构

#include <iostream>
#include <stdexcept>
#include <stack>

using namespace std;

class Queue {
private:
	stack<int> inputStack;
	stack<int> outputStack;
	
public:
	Queue() {}
	~Queue() {}
	
	void push(int value) {
		inputStack.push(value);
	}
	
	int pop() {
		if (outputStack.empty()){
			while(!inputStack.empty()){
				outputStack.push(inputStack.top());
				inputStack.pop();
			}
		}
		if (outputStack.empty()){
			throw std::out_of_range("Queue is empty");
		}
		int pop_v = outputStack.top();
		outputStack.pop();
		return pop_v;
	}
	
	int front() {
		if (outputStack.empty()){
			while(!inputStack.empty()){
				outputStack.push(inputStack.top());
				inputStack.pop();
			}
		}
		if (outputStack.empty()){
			throw std::out_of_range("Queue is empty");
		}
		return outputStack.top();
	}
	
	bool empty() const {
		return inputStack.empty() && outputStack.empty();
	}
	
}

4.基于Queue实现Stack

#include <iostream>
#include <stdexcept>
#include <queue>

using namespace std;

class Stack {
private:
	queue<int> inputQueue;
	queue<int> auxiQueue;
	
public:
	Stack() {}
	~Stack() {}
	
	void push(int value) {
		inputQueue.push(value);
	}
	
	int pop() {
		if (inputQueue.size() == 0) {
			throw std::out_of_range("Stack is empty");
		}
		while (inputQueue.size() > 1){
			auxiQueue.push(inputQueue.front());
			inputQueue.pop();
		}
		int pop_v = inputQueue.front();
		inputQueue.pop();
		std::swap(inputQueue, auxiQueue);
		return pop_v
	}
	
	int top() {
		if (inputQueue.size() == 0) {
			throw std::out_of_range("Stack is empty");
		}
		while (inputQueue.size() > 1){
			auxiQueue.push(inputQueue.front());
			inputQueue.pop();
		}
		int pop_v = inputQueue.front();
		inputQueue.pop();
		auxiQueue.push(pop_v);
		
		std::swap(inputQueue, auxiQueue);
		
		return pop_v;
	}
	
	bool empty() const {
		return inputQueue.empty();
	}
}

标签:capacity,--,pop,int,inputQueue,C++,数据结构,other,size
From: https://www.cnblogs.com/mochacoco/p/18518788

相关文章

  • 2024.10.31
    《代码大全2》是一本编程领域的经典之作,为开发者们提供了丰富且实用的指导。在阅读过程中,关于软件构建的前期准备给我留下了深刻印象。书中强调了需求分析的重要性,这就像是大厦的蓝图绘制。如果对需求理解不清晰或存在偏差,后续的代码编写可能会像没有方向的航行。例如,若开发一个......
  • 基于AFDPF主动频率偏移法的孤岛检测Simulink仿真
    1.课题概述基于AFDPF主动频率偏移法的孤岛检测Simulink仿真。 2.系统仿真结果   3.核心程序与模型版本:MATLAB2022a   4.系统原理简介       在分布式发电系统中,孤岛现象是指电网发生故障时,局部区域内的分布式电源与负荷形成独立运行的微网,这种状......
  • 十月读后感
    读后感一:技术与哲学的融合《程序员的修炼之道:从小工到专家》这本书,不仅仅是一本技术指导书,更是一本关于程序员如何成长为专家的哲学书。它教会我们,技术的提升固然重要,但更重要的是思维方式的转变。书中提到的“代码的可维护性”让我印象深刻。作者强调,代码不仅仅是为了运行,更是......
  • 2024.10.31..
    《代码大全2》是一部编程领域的瑰宝,为编程者打开了一扇通向高质量代码世界的大门。阅读此书,深刻感受到它对于编程全方位的指导意义。从前期的规划设计到具体的代码编写,再到后期的调试优化,无一遗漏。在设计阶段,它教会我们如何准确把握需求,制定合理架构,避免盲目编码。编写代码过程......
  • 2024.10.31.
    《程序员修炼之道》为程序员们呈现了一条从入门到精通的成长路径,宛如一幅指引前行的地图。书中提到的“注重实效的哲学”让我深思。它强调要以一种务实的态度对待编程,明白每个代码决策背后的价值。例如,在选择算法时,不能仅仅因为某个算法新或者复杂就选用,而要根据实际的业务场景......
  • 使用EF6连接Sqlite
    1、前置条件安装以下包EntityFrameworkSystem.Data.Sqlite以上包会自动生成或填充Config文件App.Config配置如下<?xmlversion="1.0"encoding="utf-8"?><configuration><configSections><!--FormoreinformationonEntityFrameworkconfig......
  • NZOJ NOIP模拟赛1
    T1好数设ctz(x)为x二进制下末尾0的个数,如ctz(1001000)=3。设ppc(x)为x二进制下1的个数,如ppc(1001000)=2。定义一个数是好数,当且仅当ctz(x)=ppc(x)。给定Q,有Q次询问,每次给出区间[l,r],你需要求出[l,r]中任意一个好数,或判断无输出-1。考虑逐位模拟,我们从大到小考虑,如果\(x\)......
  • 24.10.31
    不喜欢CTT模拟赛。A我卡双模哈希?尊嘟假嘟?考虑先构造出两个串把第一个模卡掉,然后用这两个串拼出两个串把第二个模卡掉。两个过程是相同的。一个很唐的方法是先随机出一个串然后检查其是否有子串哈希冲突。B题解C题解P2575博弈论。可以注意到每行互不影响,所以组合游戏......
  • Request&Respond学习
    一、RequestHttpServletRequest对象代表客户端的HTTP请求。当客户端(通常是浏览器)向Servlet发送请求时,Servlet容器会创建一个HttpServletRequest对象,并将其作为参数传递给service()、doGet()、doPost()等方法。常用方法获取请求参数StringgetParameter(Stringname):获取......
  • UOS下配置.net core环境
    1.下载sdkhttps://dotnet.microsoft.com/zh-cn/download/dotnet/thank-you/sdk-8.0.403-linux-x64-binaries2.解压并拷贝到目标目录mkdir-p$HOME/dotnet&&tarzxfdotnet-sdk-8.0.403-linux-x64.tar.gz-C$HOME/dotnet3.安装geditsudoaptinstallgedit4.配置/etc/pro......