1、queue是队列,队列应有queue_node,queue两部分组成,前者是节点的意思。
在动态管理内存的时候,注意利用new和delete这两个语句。
队列的元素个数不能用tail_ptr - head_ptr 来获取,因为不同于数组连续存储,队列的存储是随机的,头尾指针相减得到的是一个随机值!!!(不能得到长度)
2、queue.h代码如下:
注意:头文件中一般只能定义函数和类类型,如果定义变量,会被视作函数,通常会发生重定义的问题,故尽量不要再头文件中定义变量!
#ifndef QUEUE_H
#define QUEUE_H
class queue_node
{
friend class queue;//要把queue变成queue_node的友元才能使queue访问queue_node的private标签下的元素
public:
queue_node();
private:
int data;
queue_node *next_ptr;
};
class queue
{
public:
queue();// constructor
int length_max;
int num() {return num_;}
void enqueue(int);
void dequeue();
const int first() const { return head_ptr->data; };
const int last() const { return tail_ptr->data; };
bool is_empty() { return num() == 0; }
bool is_full() { return num() >= length_max; }
void alarm();
private:
int num_;
queue_node *head_ptr;
queue_node *tail_ptr;
};
#endif
3、queue.cpp代码如下:
#include <iostream>
#include "queue.h"
using namespace std;
queue_node::queue_node() :data(0), next_ptr(nullptr) {}
queue::queue() :length_max(0),num_(0),head_ptr(nullptr), tail_ptr(nullptr) {}<strong>//注意到初始化可以同时初始化public和private两种类型的变量,且注意初始化一般都放在cpp文件中,否则容易出错。
</strong>
void queue::enqueue(int in)
{
if (is_full())
{
cout << "Error, this queue is full!" << endl;
return;
}
queue_node *new_node_ptr = new queue_node;<strong>//注意new的用法,动态申请内存!</strong>
new_node_ptr->data = in;
if (is_empty())
{
head_ptr = new_node_ptr;
tail_ptr = new_node_ptr;
num_++;
return;
}
else
{
tail_ptr->next_ptr = new_node_ptr;
tail_ptr = new_node_ptr;
num_++;
return;
}
}
void queue::dequeue()
{
if (is_empty())
{
cout << "This queue is empty!" << endl;
return;
}
queue_node *new_node_ptr = new queue_node;
new_node_ptr = head_ptr->next_ptr;
delete head_ptr; <strong>//动态删除一个内存</strong>
head_ptr = new_node_ptr;
num_--;
return;
}
void queue::alarm()
{
if (is_full())
cout << "This queue is full!" << endl;
}