Untitled

mail@pastecode.io avatar
unknown
c_cpp
10 months ago
7.5 kB
2
Indexable
    template <typename T>
    T* cyclic_double_queue<T>::resize(size_t new_size)
    {
        /*copying old array into new array */
        T* newArray = new T[new_size]();
        m_backIndex = 0;
        for (int i=0; i < m_size; i++) {
            newArray[i] = m_data[m_frontIndex];
            m_frontIndex++;
            m_backIndex++;
            if (m_frontIndex >= m_capacity) {
                m_frontIndex = 0;   
            }
        }
        m_frontIndex = 0;

        std :: cout << "I resized the array\n";

        for(int i =0; i<new_size; i++){
            std::cout << newArray[i] << " ";
        }
        std :: cout << "\n";

        std :: cout << "Front = " << m_frontIndex << " and Back = " << m_backIndex << "\n"; 

        return newArray;
    }

	template <typename T>
	void cyclic_double_queue<T>::enqueue_front(const T& item)
	{
		//TODO: Remove following line and add your implementation here.
        
		if (m_size == m_capacity) {
            m_data = resize(m_capacity * m_increaseFactor);
            m_capacity = m_capacity * m_increaseFactor;
        }

        if (m_frontIndex == 0) {
            m_frontIndex = m_capacity - 1;
        } else {
            m_frontIndex--;
        }

        m_data[m_frontIndex] = item;
        m_size++;

        std :: cout << "I Enqueued front\n";

        for(int i =0; i<m_capacity; i++){
            std::cout << m_data[i] << " ";
        }
        std :: cout << "\n";
    
	}

	template <typename T>
	void cyclic_double_queue<T>::enqueue_back(const T& item)
	{
		//TODO: Remove following line and add your implementation here.
		if (m_size == m_capacity) {
            m_data = resize(m_capacity * m_increaseFactor);
            m_capacity = m_capacity * m_increaseFactor;
        }
        m_data[m_backIndex] = item;
        m_backIndex++;
        if(m_backIndex == m_capacity) {
         m_backIndex = 0;   
        }
        m_size++;

        std :: cout << "I Enqueued back\n";

        for(int i =0; i<m_capacity; i++){
            std::cout << m_data[i] << " ";
        }
        std :: cout << "\n";

	}

	template <typename T>
	T cyclic_double_queue<T>::dequeue_front()
	{
		//TODO: Remove following line and add your implementation here.
        if (empty()) {
            throw std::out_of_range("cyclic_double_queue is empty!");
        }

        T item = m_data[m_frontIndex];
        m_frontIndex = (m_frontIndex + 1) % m_capacity;
        m_size--;

        std :: cout << "I Dequeued front\nNow, my front = "<<m_frontIndex << "and back = "<<m_backIndex << "\n";

        for(int i =0; i<m_capacity; i++){
            std::cout << m_data[i] << " ";
        }
        std :: cout << "\n";
        
        if (m_capacity > 4 * m_size) {
            
            if((m_capacity/m_decreaseFactor) > m_initialCapacity) {
                m_data = resize((m_capacity/m_decreaseFactor));
                m_capacity = m_capacity/m_decreaseFactor;
            }
            else {
                m_data = resize(m_initialCapacity);
                m_capacity = m_initialCapacity;   
            }
        }


        return item; 
	}

	template <typename T>
	T cyclic_double_queue<T>::dequeue_back()
	{
		//TODO: Remove following line and add your implementation here.
        if (empty()) {
            throw std::out_of_range("cyclic_double_queue is empty!");
        }
        if (m_backIndex == 0) {
            m_backIndex = m_capacity - 1;
        } else {
			m_backIndex--;
		}

        T item = m_data[m_backIndex];
        m_size--;

        std :: cout << "I Dequeued back\n";

        for(int i =0; i<m_capacity; i++){
            std::cout << m_data[i] << " ";
        }
        std :: cout << "\n";
        
        if (m_capacity > 4 * m_size) {
            if((m_capacity/m_decreaseFactor) > m_initialCapacity) {
                m_data = resize((m_capacity/m_decreaseFactor));
                m_capacity = m_capacity/m_decreaseFactor;
            }
            else{
                m_data = resize(m_initialCapacity);
                m_capacity = m_initialCapacity;
            }
        }



        return item;
	}

	template <typename T>
	void cyclic_double_queue<T>::pop_front()
	{
		//TODO: Remove following line and add your implementation here.
		dequeue_front();
	}

	template <typename T>
	void cyclic_double_queue<T>::pop_back()
	{
		//TODO: Remove following line and add your implementation here.
		dequeue_back();
	}

	template <typename T>
	bool cyclic_double_queue<T>::empty() const
	{
		//TODO: Remove following line and add your implementation here.
		if (m_size == 0) {
            return true;
        }
        else {
            return false;
        }
	}

	template <typename T>
	T& cyclic_double_queue<T>::front()
	{
		//TODO: Remove following line and add your implementation here.
		if (empty()) {
            throw std::out_of_range("cyclic_double_queue is empty!");
        }

        return m_data[m_frontIndex];
	}

	template <typename T>
	T& cyclic_double_queue<T>::back()
	{
		//TODO: Remove following line and add your implementation here.
		if (empty()) {
            throw std::out_of_range("cyclic_double_queue is empty!");
        }
        
        
        if (m_backIndex == 0) {
            return m_data[m_capacity - 1];
        } 

        return m_data[m_backIndex - 1];
	}

	template <typename T>
	void cyclic_double_queue<T>::clear()
	{
		//TODO: Remove following line and add your implementation here.
		delete[] m_data;
        m_capacity = m_initialCapacity;
        m_data = new T[m_capacity];
        m_frontIndex = 0;
        m_backIndex = 0;
        m_size = 0;

	}

	template <typename T>
	std::string cyclic_double_queue<T>::print_status() const
	{
		//TODO: Remove following line and add your implementation here.
		std::string result;
        if(m_size == 0){
            for(size_t i = 0; i<m_capacity; ++i){
                result += "[-]";
            }
        }
        else if(m_size == m_capacity){
            for(size_t i =0; i<m_capacity; i++){
                result += "[+]";
            }
        }
        else {
            if(m_backIndex < m_frontIndex){
                for (size_t i = 0; i < m_capacity; ++i) {
                    if(i < m_backIndex && i < m_frontIndex){
                        result += "[+]";
                    }
                    else if(i < m_frontIndex){
                        result += "[-]";
                    }
                    else{
                        result += "[+]";
                    }
                }
            }
            else{
                for(size_t i =0; i<m_capacity; i++){
                    if(i >= m_frontIndex && i < m_backIndex){
                        result += "[+]";
                    }
                    else{
                        result += "[-]";
                    }
                }
            }
        }
        return result;
    }

	template <typename T>
	size_t cyclic_double_queue<T>::get_size() const
	{
		//TODO: Remove following line and add your implementation here.
		return m_size;
	}

	template <typename T>
	size_t cyclic_double_queue<T>::get_capacity() const
	{
		//TODO: Remove following line and add your implementation here.
		return m_capacity;
	}
    
    
Leave a Comment