C++ 手撕--基本資料結構的簡單實現

风枕子發表於2024-10-31

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();
	}
}

相關文章