C++用数组结构实现大小固定的队列

1. 思路

队列的先进先出的,需要一个数组和4个变量size,end,start,length。size记录已经进来了多少个元素,end记录刚进来的元素应该放在哪个位置,start表示用户要求弹出的元素所在的位置。size的作用不止于此,它还是end与start的操作的关键信息,使得end与start解耦,避免的很多的麻烦,当end或者start到底部的时候就跳回0处。length是数组的长度,构造函数时候可以赋值。

2. 代码

// 固定数组实现队列结构

#include <iostream>
#include <exception>

class ArrayIndexOutOfBoundsException : public std::exception {
 public:
    ArrayIndexOutOfBoundsException(const char* ptr) {
        this -> ptr = ptr;
    }
    virtual const char* what() {
        std::cout << this -> ptr << std::endl;
        return ptr;
    }
 private:
    const char* ptr;
};

class MyQueue {
 public:
     MyQueue(int myqueue_size_); // 构造函数
     ~MyQueue();    // 析构函数
     void myMyQueuePush(int element); // 入队列
     int myMyQueuePop();  // 出队列
     int myMyQueuePeek(); // 获取队列顶元素
     void printMyQueue();   // 打印队列
 private:
    int* mydata_;
    int myqueue_size_;  // 队列的大小
    int myqueue_index_; // 队列当前的索引
    int myqueue_end_;   // push时候++
    int myqueue_start_;  // pop时候--
};

MyQueue::MyQueue(int myqueue_size_) {
    this -> myqueue_size_ = myqueue_size_;
    mydata_ = new int[myqueue_size_];
    myqueue_index_ = 0;
    myqueue_end_ = 0;
    myqueue_start_ = 0;
}
MyQueue::~MyQueue() {
    delete [] mydata_;
}
void MyQueue::myMyQueuePush(int element) {
    if (myqueue_index_ == myqueue_size_) {
        throw ArrayIndexOutOfBoundsException("queue is full");
    } else {
        ++myqueue_index_;
        mydata_[myqueue_end_] = element;
        myqueue_end_ = myqueue_end_ == myqueue_size_ - 1 ? 0 : myqueue_end_ + 1;    // 如果一个轮回的话end自动变成0
    }
}
int MyQueue::myMyQueuePop() {
    if (myqueue_index_ == 0) {
        throw ArrayIndexOutOfBoundsException("queue is empty");
    } else {
        --myqueue_index_;
        int tmp = myqueue_start_;   // 保持当前的变量
        myqueue_start_ = myqueue_start_ == myqueue_size_ - 1 ? 0 : myqueue_start_ + 1;  // 如果已经经历一个轮回的话start变成0
        return mydata_[tmp];
    }
}
int MyQueue::myMyQueuePeek() {
    if (myqueue_index_ == 0) {
        return -1;
    } else {
        return mydata_[myqueue_start_];
    }
}
void MyQueue::printMyQueue() {
    for (int i = 0; i < myqueue_size_; ++i) {
        std::cout << mydata_[i] << ',';
    }
    std::cout << "\n";
}
int main() {
    MyQueue myQueue1(5);
    myQueue1.myMyQueuePush(1);
    myQueue1.myMyQueuePush(2);
    myQueue1.myMyQueuePush(3);
    myQueue1.myMyQueuePush(4);
    myQueue1.myMyQueuePush(5);

    myQueue1.printMyQueue();
    for (int i  = 0; i < 5; ++i) {
        std::cout << "pop=" << myQueue1.myMyQueuePop() << ",";
        std::cout << std::endl;
    }
    myQueue1.printMyQueue();
    return 0;
}

在这里插入图片描述

3. 参考文献

  1. C++用数组实现一个固定大小的栈/队列
  2. 用数组结构实现大小固定的栈和队列
  3. C++用数组结构实现大小固定的栈
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值