文章目录
- 1. 队列
- 1.1 什么是队列
- 1.2 队列的结构
- 1.3 队列初始化
- 1.4 队列入栈
- 1.5 出队列
- 1.6 查找队列有效元素个数
- 1.7 取队头和队尾数据
- 1.8 销毁链表
- 2. 用两个队列实现栈
- 3. 用两个栈实现队列
- 4. 循环队列
1. 队列
1.1 什么是队列
- 只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表
- 栈只允许在栈顶进行插入数据删除数据的操作,称为入栈、出栈(或压栈)
- 队列则是队尾进队头出,满足先进先出的原则,而栈则是后进先出
1.2 队列的结构
typedef int QueueDataType;
typedef struct QueueNode
{
QueueDataType data;
struct QueueNode* next;
}QueueNode;
typedef struct Queue
{
QueueNode* phead;
QueueNode* ptail;
}Queue;
1.3 队列初始化
1.4 队列入栈
void QueuePush(Queue* pq, QueueDataType x)
{
assert(pq);
QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
if (newnode== NULL)
{
perror("malloc fail!\n");
exit(1);
}
newnode->data = x;
newnode->next = NULL;
if (pq->phead == NULL)
{
pq->phead = pq->ptail = newnode;
}
else
{
pq->ptail->next = newnode;
pq->ptail = pq->ptail->next;
}
}
1.5 出队列
bool QueueEmpty(Queue* pq)
{
assert(pq);
return pq->phead == NULL;
}
void QueuePop(Quene* pq)
{
assert(pq && !QueueEmpty(pq));
if (pq->phead == pq->ptail)
{
free(pq->phead);
pq->phead = pq->ptail = NULL;
}
else
{
QueueNode* next = pq->phead->next;
free(pq->phead);
pq->phead = next;
}
}
1.6 查找队列有效元素个数
int QueueSize(Queue* pq)
{
assert(pq);
return pq->size;
}
1.7 取队头和队尾数据
1.8 销毁链表
2. 用两个队列实现栈
3. 用两个栈实现队列
4. 循环队列