目录
1、队列
1.1思想
2、队列的两类
2.1顺序队列
2.2链式队列
谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注
没错,说的就是你,不用再怀疑!!!
希望我的文章内容能对你有帮助,一起努力吧!!!
1、队列
1.1思想
- 先进先出,后进后出
- 例如:排队买奶茶
- 入队:队伍新增一个来买奶茶的人。(应当要排在队伍最后面)
- 出队:有一个一个买到了奶茶离开队伍。(应当是队伍第一个人)
2、队列的两类
2.1顺序队列
- 数组+整型===>结构体
struct queue {
int head; // 表示队头
int tail; // 表示队尾
ElementType queue[MAXLENG]; // 数组:表示队列的空
};
- 地址是连续
- 循环队列解决无法回到起点问题
- 循环队列存在一个空间会浪费
- 解决:在结构体再定义一个长度
示例代码:
#include <iostream>
#define QUEUEERR 0xefffff
#define MAX 10
/*
为空:head和tail相等的时候
为满:tail减head等于10的时候
head:指向已出元素的位置
tail:指向待入队元素的位置
*/
typedef struct Queue
{
int length;
int head;
int tail;
int q[MAX];
}Queue;
Queue *createSeqQueue()
{
Queue *q = new Queue;
// 初始化为空
q->head = 0;
q->tail = 0;
return q;
}
/*
@brief 入队
@param queue 需要入队的队列指针
@param data 需要入队的数据
@return 成功返回true,失败返回false
*/
bool push_data(Queue *queue, int data)
{
std::cout << "tail:" <<queue->tail << std::endl;
// 判断队列是否是满的
if((queue->tail+1)%MAX==queue->head) // 就是判断下一个位置是不是head
return false;
// 重置下标
queue->tail = (queue->tail+1)%MAX;
queue->q[queue->tail] = data;
return true;
}
/*
@brief 出队
@param queue需要出队的队列指针
@return 成功返回出队的元素,失败返回QUEUEERR
*/
int pop_data(Queue *queue)
{
// 判断队列是否空了
/*
if(queue->head == queue->tail-1) // 越界非常严重
return QUEUEERR;
*/
std::cout << "head:" << queue->head << std::endl;
if(queue->tail == queue->head)
return QUEUEERR;
int data = queue->q[queue->head];
queue->head = (queue->head+1)%MAX;
return data;
}
int main()
{
Queue *queue = createSeqQueue();
// 存元素
for(int i = 1;i <= 20;i ++)
{
if(push_data(queue,i))
std::cout << "存入" << i << "个" << std::endl;
else
break;
}
std::cout << queue->tail << std::endl;
while(1)
{
int data = pop_data(queue);
if(data == QUEUEERR)
break;
std::cout << data << std::endl;
}
return 0;
}
2.2链式队列
带头结点的单链表实现
示例代码:
#include <iostream>
#define QUEUEERR 0xefffff
struct node
{
int data;
struct node *next;
};
struct head
{
struct node *first;
struct node *final;
};
struct head *createListQueue()
{
struct head *queue = new struct head;
queue->final = nullptr;
queue->first = nullptr;
return queue;
}
/*
头插
*/
void push_data(struct head *queue,int data)
{
if(!queue)
return;
struct node *node_ptr = new struct node;
node_ptr->data = data;
node_ptr->next = queue->first;
queue->first = node_ptr;
// 作为第一个结点插入的时候
if(queue->final == nullptr)
queue->final = node_ptr;
}
/*
尾取
*/
int pop_data(struct head*queue)
{
if(!queue)
return QUEUEERR;
if(queue->first == nullptr)
return QUEUEERR;
if(queue->first == queue->final)
{
int data = queue->final->data;
queue->first = nullptr;
queue->final = nullptr;
return data;
}
int data = queue->final->data;
struct node *node_ptr = queue->final;
queue->final = queue->first;
// 更新队列final指针
while(queue->final->next != node_ptr)queue->final = queue->final->next;
return data;
}
int main()
{
struct head *queue = createListQueue();
std::cout << __LINE__ << std::endl;
push_data(queue,5);
push_data(queue,4);
push_data(queue,3);
push_data(queue,2);
push_data(queue,1);
push_data(queue,0);
std::cout << pop_data(queue) << std::endl;
std::cout << pop_data(queue) << std::endl;
std::cout << pop_data(queue) << std::endl;
while(1)
{
int data = pop_data(queue);
if(data == QUEUEERR)
break;
std::cout << data << std::endl;
}
return 0;
}